I have been trying to find out why my injected code doesn't run in
vain. I wanted to share some IL code resulting from my game profiler
to see if anyone could help identify the issue.

As a reminder, CommanderApplication inherits from Application which
holds an instance of a GameState class.
The following methods get called
CommanderApplication.Update()
{_profilerAttributeXXX.StartProfilingMethod()},
Application.Update(){_profilerAttributeXXX.StartProfilingMethod()},
Application.Update(){_profilerAttributeXXX.EndProfilingMethod()},
CommanderApplication.Draw()
{_profilerAttributeXXX.StartProfilingMethod()},
Application.Draw(){_profilerAttributeXXX.StartProfilingMethod()}
Application.Draw(){_profilerAttributeXXX.EndProfilingMethod()}

but these don't:
CommanderApplication.Update()
{_profilerAttributeXXX.EndProfilingMethod()},
CommanderApplication.Draw()
{_profilerAttributeXXX.EndProfilingMethod()},

CommanderApplication Update:
C#
protected override void Update(GameTime gameTime)
{
    __profilerAttribute131.ProfilingMethodStart(this, (MethodInfo)
MethodBase.GetCurrentMethod());
    base.Update(gameTime);
    __profilerAttribute131.ProfilingMethodEnd();
}

IL
.method family hidebysig virtual instance void Update(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime
gameTime) cil managed
{
    .maxstack 8
    L_0000: ldsfld class
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute
Indiefreaks.Commander.CommanderApplication::__profilerAttribute131
    L_0005: ldarg.0
    L_0006: call class [mscorlib]System.Reflection.MethodBase
[mscorlib]System.Reflection.MethodBase::GetCurrentMethod()
    L_000b: castclass [mscorlib]System.Reflection.MethodInfo
    L_0010: callvirt instance void
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute::ProfilingMethodStart(object,
class [mscorlib]System.Reflection.MethodInfo)
    L_0015: ldarg.0
    L_0016: ldarg.1
    L_0017: call instance void
[Indiefreaks.Game.Framework]Indiefreaks.Xna.Core.Application::Update(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime)
    L_001c: ldsfld class
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute
Indiefreaks.Commander.CommanderApplication::__profilerAttribute131
    L_0021: call instance void
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute::ProfilingMethodEnd()
    L_0026: ret
}

CommanderApplication Draw:
C#
protected override void Draw(GameTime gameTime)
{
    __profilerAttribute132.ProfilingMethodStart(this, (MethodInfo)
MethodBase.GetCurrentMethod());
    base.Draw(gameTime);
    __profilerAttribute132.ProfilingMethodEnd();
    ProfilingManager.Update();
}

IL
.method family hidebysig virtual instance void Draw(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime
gameTime) cil managed
{
    .maxstack 8
    L_0000: ldsfld class
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute
Indiefreaks.Commander.CommanderApplication::__profilerAttribute132
    L_0005: ldarg.0
    L_0006: call class [mscorlib]System.Reflection.MethodBase
[mscorlib]System.Reflection.MethodBase::GetCurrentMethod()
    L_000b: castclass [mscorlib]System.Reflection.MethodInfo
    L_0010: callvirt instance void
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute::ProfilingMethodStart(object,
class [mscorlib]System.Reflection.MethodInfo)
    L_0015: ldarg.0
    L_0016: ldarg.1
    L_0017: call instance void
[Indiefreaks.Game.Framework]Indiefreaks.Xna.Core.Application::Draw(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime)
    L_001c: ldsfld class
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute
Indiefreaks.Commander.CommanderApplication::__profilerAttribute132
    L_0021: call instance void
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute::ProfilingMethodEnd()
    L_0026: call void
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilingManager::Update()
    L_002b: ret
}

Application Update:
C#
protected override void Update(GameTime gameTime)
{
    __profilerAttribute463.ProfilingMethodStart(this, (MethodInfo)
MethodBase.GetCurrentMethod());
    if ((SunBurn.Editor != null) && SunBurn.Editor.EditorAttached)
    {
        Input.Enabled = false;
    }
    else
    {
        Input.Enabled = true;
    }
    base.Update(gameTime);
    this.Threads.Update();
    Interpolator.Update((float)
gameTime.ElapsedGameTime.TotalSeconds);
    Timer.Update((float) gameTime.ElapsedGameTime.TotalSeconds);
    if (((this.ActiveGameState != null) &&
this.ActiveGameState.IsLoadingComplete) && ((this._loadingGameState ==
null) || this._loadingGameState.ShouldRenderLoadedGameState))
    {
        ((IUpdate) this.ActiveGameState).Update(gameTime);
    }
    if (((this._loadingGameState != null) &&
this._loadingGameState.IsLoadingComplete) && !
this._loadingGameState.ShouldRenderLoadedGameState)
    {
        ((IUpdate) this._loadingGameState).Update(gameTime);
    }
    __profilerAttribute463.ProfilingMethodEnd();
}

IL
.method family hidebysig virtual instance void Update(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime
gameTime) cil managed
{
    .maxstack 3
    .locals init (
        [0] valuetype [mscorlib]System.TimeSpan CS$0$0000,
        [1] valuetype [mscorlib]System.TimeSpan CS$0$0001)
    L_0000: ldsfld class
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute
Indiefreaks.Xna.Core.Application::__profilerAttribute463
    L_0005: ldarg.0
    L_0006: call class [mscorlib]System.Reflection.MethodBase
[mscorlib]System.Reflection.MethodBase::GetCurrentMethod()
    L_000b: castclass [mscorlib]System.Reflection.MethodInfo
    L_0010: callvirt instance void
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute::ProfilingMethodStart(object,
class [mscorlib]System.Reflection.MethodInfo)
    L_0015: call class [SynapseGaming-SunBurn-
Pro]SynapseGaming.LightingSystem.Core.SceneInterface
Indiefreaks.Xna.Core.Application::get_SunBurn()
    L_001a: callvirt instance class [SynapseGaming-SunBurn-
Pro]SynapseGaming.LightingSystem.Editor.LightingSystemEditor
[SynapseGaming-SunBurn-
Pro]SynapseGaming.LightingSystem.Core.SceneInterface::get_Editor()
    L_001f: brfalse.s L_003f
    L_0021: call class [SynapseGaming-SunBurn-
Pro]SynapseGaming.LightingSystem.Core.SceneInterface
Indiefreaks.Xna.Core.Application::get_SunBurn()
    L_0026: callvirt instance class [SynapseGaming-SunBurn-
Pro]SynapseGaming.LightingSystem.Editor.LightingSystemEditor
[SynapseGaming-SunBurn-
Pro]SynapseGaming.LightingSystem.Core.SceneInterface::get_Editor()
    L_002b: callvirt instance bool [SynapseGaming-SunBurn-
Pro]SynapseGaming.LightingSystem.Editor.LightingSystemEditor::get_EditorAttached()
    L_0030: brfalse.s L_003f
    L_0032: call class Indiefreaks.Xna.Input.InputManager
Indiefreaks.Xna.Core.Application::get_Input()
    L_0037: ldc.i4.0
    L_0038: callvirt instance void
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameComponent::set_Enabled(bool)
    L_003d: br.s L_004a
    L_003f: call class Indiefreaks.Xna.Input.InputManager
Indiefreaks.Xna.Core.Application::get_Input()
    L_0044: ldc.i4.1
    L_0045: callvirt instance void
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameComponent::set_Enabled(bool)
    L_004a: ldarg.0
    L_004b: ldarg.1
    L_004c: call instance void
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.Game::Update(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime)
    L_0051: ldarg.0
    L_0052: call instance class Indiefreaks.Xna.Threading.ThreadPool
Indiefreaks.Xna.Core.Application::get_Threads()
    L_0057: callvirt instance void
Indiefreaks.Xna.Threading.ThreadPool::Update()
    L_005c: ldarg.1
    L_005d: callvirt instance valuetype [mscorlib]System.TimeSpan
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime::get_ElapsedGameTime()
    L_0062: stloc.0
    L_0063: ldloca.s CS$0$0000
    L_0065: call instance float64
[mscorlib]System.TimeSpan::get_TotalSeconds()
    L_006a: conv.r4
    L_006b: call void
Indiefreaks.Xna.Core.Interpolator::Update(float32)
    L_0070: ldarg.1
    L_0071: callvirt instance valuetype [mscorlib]System.TimeSpan
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime::get_ElapsedGameTime()
    L_0076: stloc.1
    L_0077: ldloca.s CS$0$0001
    L_0079: call instance float64
[mscorlib]System.TimeSpan::get_TotalSeconds()
    L_007e: conv.r4
    L_007f: call void Indiefreaks.Xna.Core.Timer::Update(float32)
    L_0084: ldarg.0
    L_0085: call instance class Indiefreaks.Xna.Core.GameState
Indiefreaks.Xna.Core.Application::get_ActiveGameState()
    L_008a: brfalse.s L_00ba
    L_008c: ldarg.0
    L_008d: call instance class Indiefreaks.Xna.Core.GameState
Indiefreaks.Xna.Core.Application::get_ActiveGameState()
    L_0092: callvirt instance bool
Indiefreaks.Xna.Core.GameState::get_IsLoadingComplete()
    L_0097: brfalse.s L_00ba
    L_0099: ldarg.0
    L_009a: ldfld class Indiefreaks.Xna.Core.LoadingGameState
Indiefreaks.Xna.Core.Application::_loadingGameState
    L_009f: brfalse.s L_00ae
    L_00a1: ldarg.0
    L_00a2: ldfld class Indiefreaks.Xna.Core.LoadingGameState
Indiefreaks.Xna.Core.Application::_loadingGameState
    L_00a7: callvirt instance bool
Indiefreaks.Xna.Core.LoadingGameState::get_ShouldRenderLoadedGameState()
    L_00ac: brfalse.s L_00ba
    L_00ae: ldarg.0
    L_00af: call instance class Indiefreaks.Xna.Core.GameState
Indiefreaks.Xna.Core.Application::get_ActiveGameState()
    L_00b4: ldarg.1
    L_00b5: callvirt instance void
Indiefreaks.Xna.Core.IUpdate::Update(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime)
    L_00ba: ldarg.0
    L_00bb: ldfld class Indiefreaks.Xna.Core.LoadingGameState
Indiefreaks.Xna.Core.Application::_loadingGameState
    L_00c0: brfalse.s L_00e8
    L_00c2: ldarg.0
    L_00c3: ldfld class Indiefreaks.Xna.Core.LoadingGameState
Indiefreaks.Xna.Core.Application::_loadingGameState
    L_00c8: callvirt instance bool
Indiefreaks.Xna.Core.GameState::get_IsLoadingComplete()
    L_00cd: brfalse.s L_00e8
    L_00cf: ldarg.0
    L_00d0: ldfld class Indiefreaks.Xna.Core.LoadingGameState
Indiefreaks.Xna.Core.Application::_loadingGameState
    L_00d5: callvirt instance bool
Indiefreaks.Xna.Core.LoadingGameState::get_ShouldRenderLoadedGameState()
    L_00da: brtrue.s L_00e8
    L_00dc: ldarg.0
    L_00dd: ldfld class Indiefreaks.Xna.Core.LoadingGameState
Indiefreaks.Xna.Core.Application::_loadingGameState
    L_00e2: ldarg.1
    L_00e3: callvirt instance void
Indiefreaks.Xna.Core.IUpdate::Update(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime)
    L_00e8: ldsfld class
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute
Indiefreaks.Xna.Core.Application::__profilerAttribute463
    L_00ed: call instance void
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute::ProfilingMethodEnd()
    L_00f2: ret
}

Application Draw:
C#
protected override void Draw(GameTime gameTime)
{
    __profilerAttribute464.ProfilingMethodStart(this, (MethodInfo)
MethodBase.GetCurrentMethod());
    base.GraphicsDevice.Clear(Color.Black);
    if (((this._loadingGameState != null) &&
this._loadingGameState.IsLoadingComplete) && !
this._loadingGameState.ShouldRenderLoadedGameState)
    {
        ((IDraw) this._loadingGameState).Draw(gameTime);
    }
    else if ((this.ActiveGameState != null) &&
this.ActiveGameState.IsLoadingComplete)
    {
        ((IDraw) this.ActiveGameState).Draw(gameTime);
    }
    if ((this._transitionColor.A != 0f) || (this._transitionColor.A !=
1f))
    {
        this._transitionRenderer.Begin(SpriteSortMode.Immediate,
BlendState.AlphaBlend);
        this._transitionRenderer.Draw(this._transitionTexture,
base.GraphicsDevice.Viewport.Bounds, this._transitionColor);
        this._transitionRenderer.End();
    }
    base.Draw(gameTime);
    __profilerAttribute464.ProfilingMethodEnd();
}

IL
.method family hidebysig virtual instance void Draw(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime
gameTime) cil managed
{
    .maxstack 4
    .locals init (
        [0] valuetype
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.Viewport
CS$0$0000)
    L_0000: ldsfld class
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute
Indiefreaks.Xna.Core.Application::__profilerAttribute464
    L_0005: ldarg.0
    L_0006: call class [mscorlib]System.Reflection.MethodBase
[mscorlib]System.Reflection.MethodBase::GetCurrentMethod()
    L_000b: castclass [mscorlib]System.Reflection.MethodInfo
    L_0010: callvirt instance void
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute::ProfilingMethodStart(object,
class [mscorlib]System.Reflection.MethodInfo)
    L_0015: ldarg.0
    L_0016: call instance class
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.GraphicsDevice
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.Game::get_GraphicsDevice()
    L_001b: call valuetype
[Microsoft.Xna.Framework]Microsoft.Xna.Framework.Color
[Microsoft.Xna.Framework]Microsoft.Xna.Framework.Color::get_Black()
    L_0020: callvirt instance void
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.GraphicsDevice::Clear(valuetype
[Microsoft.Xna.Framework]Microsoft.Xna.Framework.Color)
    L_0025: ldarg.0
    L_0026: ldfld class Indiefreaks.Xna.Core.LoadingGameState
Indiefreaks.Xna.Core.Application::_loadingGameState
    L_002b: brfalse.s L_0055
    L_002d: ldarg.0
    L_002e: ldfld class Indiefreaks.Xna.Core.LoadingGameState
Indiefreaks.Xna.Core.Application::_loadingGameState
    L_0033: callvirt instance bool
Indiefreaks.Xna.Core.GameState::get_IsLoadingComplete()
    L_0038: brfalse.s L_0055
    L_003a: ldarg.0
    L_003b: ldfld class Indiefreaks.Xna.Core.LoadingGameState
Indiefreaks.Xna.Core.Application::_loadingGameState
    L_0040: callvirt instance bool
Indiefreaks.Xna.Core.LoadingGameState::get_ShouldRenderLoadedGameState()
    L_0045: brtrue.s L_0055
    L_0047: ldarg.0
    L_0048: ldfld class Indiefreaks.Xna.Core.LoadingGameState
Indiefreaks.Xna.Core.Application::_loadingGameState
    L_004d: ldarg.1
    L_004e: callvirt instance void
Indiefreaks.Xna.Core.IDraw::Draw(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime)
    L_0053: br.s L_0076
    L_0055: ldarg.0
    L_0056: call instance class Indiefreaks.Xna.Core.GameState
Indiefreaks.Xna.Core.Application::get_ActiveGameState()
    L_005b: brfalse.s L_0076
    L_005d: ldarg.0
    L_005e: call instance class Indiefreaks.Xna.Core.GameState
Indiefreaks.Xna.Core.Application::get_ActiveGameState()
    L_0063: callvirt instance bool
Indiefreaks.Xna.Core.GameState::get_IsLoadingComplete()
    L_0068: brfalse.s L_0076
    L_006a: ldarg.0
    L_006b: call instance class Indiefreaks.Xna.Core.GameState
Indiefreaks.Xna.Core.Application::get_ActiveGameState()
    L_0070: ldarg.1
    L_0071: callvirt instance void
Indiefreaks.Xna.Core.IDraw::Draw(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime)
    L_0076: ldarg.0
    L_0077: ldflda valuetype
[Microsoft.Xna.Framework]Microsoft.Xna.Framework.Color
Indiefreaks.Xna.Core.Application::_transitionColor
    L_007c: call instance uint8
[Microsoft.Xna.Framework]Microsoft.Xna.Framework.Color::get_A()
    L_0081: conv.r4
    L_0082: ldc.r4 0
    L_0087: bne.un.s L_009c
    L_0089: ldarg.0
    L_008a: ldflda valuetype
[Microsoft.Xna.Framework]Microsoft.Xna.Framework.Color
Indiefreaks.Xna.Core.Application::_transitionColor
    L_008f: call instance uint8
[Microsoft.Xna.Framework]Microsoft.Xna.Framework.Color::get_A()
    L_0094: conv.r4
    L_0095: ldc.r4 1
    L_009a: beq.s L_00e2
    L_009c: ldarg.0
    L_009d: ldfld class
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.SpriteBatch
Indiefreaks.Xna.Core.Application::_transitionRenderer
    L_00a2: ldc.i4.1
    L_00a3: ldsfld class
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.BlendState
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.BlendState::AlphaBlend
    L_00a8: callvirt instance void
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.SpriteBatch::Begin(valuetype
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.SpriteSortMode,
class
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.BlendState)
    L_00ad: ldarg.0
    L_00ae: ldfld class
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.SpriteBatch
Indiefreaks.Xna.Core.Application::_transitionRenderer
    L_00b3: ldarg.0
    L_00b4: ldfld class
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.Texture2D
Indiefreaks.Xna.Core.Application::_transitionTexture
    L_00b9: ldarg.0
    L_00ba: call instance class
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.GraphicsDevice
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.Game::get_GraphicsDevice()
    L_00bf: callvirt instance valuetype
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.Viewport
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.GraphicsDevice::get_Viewport()
    L_00c4: stloc.0
    L_00c5: ldloca.s CS$0$0000
    L_00c7: call instance valuetype
[Microsoft.Xna.Framework]Microsoft.Xna.Framework.Rectangle
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.Viewport::get_Bounds()
    L_00cc: ldarg.0
    L_00cd: ldfld valuetype
[Microsoft.Xna.Framework]Microsoft.Xna.Framework.Color
Indiefreaks.Xna.Core.Application::_transitionColor
    L_00d2: callvirt instance void
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.SpriteBatch::Draw(class
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.Texture2D,
valuetype [Microsoft.Xna.Framework]Microsoft.Xna.Framework.Rectangle,
valuetype [Microsoft.Xna.Framework]Microsoft.Xna.Framework.Color)
    L_00d7: ldarg.0
    L_00d8: ldfld class
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.SpriteBatch
Indiefreaks.Xna.Core.Application::_transitionRenderer
    L_00dd: callvirt instance void
[Microsoft.Xna.Framework.Graphics]Microsoft.Xna.Framework.Graphics.SpriteBatch::End()
    L_00e2: ldarg.0
    L_00e3: ldarg.1
    L_00e4: call instance void
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.Game::Draw(class
[Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime)
    L_00e9: ldsfld class
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute
Indiefreaks.Xna.Core.Application::__profilerAttribute464
    L_00ee: call instance void
[Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute::ProfilingMethodEnd()
    L_00f3: ret
}


Thanks

On 12 juil, 12:31, "Indiefreaks.com" <[email protected]>
wrote:
> Hi,
>
> Here is another issue I'm meeting with my game profiler.
>
> As a quick reminder, my game profiler does inject two method calls to
> each methods before and after the actual method body in a given
> assembly to store profiled data in static fields that are also added
> to the type during the build process.
>
> everything works fine but I have a strange behavior.
> Imagine the following solution:
>
> Indiefreaks.Game.Framework Project (dll assembly)
> --- Application class
> ------- Update virtual method
> ------- Draw virtual method
> --- IUpdate interface
> ------- Update method
> --- IDraw interface
> ------- Draw method
> --- GameState class implements IUpdate & IDraw
> ------- IUpdate.Update method (explicit implementation)
> ------- Update virtual method (called by IUpdate.Update)
>
> Commander game (exe assembly)
> --- CommanderApplication class inherits from Application
> ------- Update method overrides Application.Update
> ------- Draw method overrides Application.Draw
>
> My first problem is that when I inject my profiling code in both
> assemblies, my CommanderApplication.Draw method does include the right
> code (verified in Reflector):
>
> protected override void Draw(GameTime gameTime)
> {
>     __profilerAttribute132.ProfilingMethodStart(this, (MethodInfo)
> MethodBase.GetCurrentMethod());
>     base.Draw(gameTime);
>     __profilerAttribute132.ProfilingMethodEnd();
>     ProfilingManager.Update();
>
> }
>
> And here is the IL code:
>
> .method family hidebysig virtual instance void Draw(class
> [Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime
> gameTime) cil managed
> {
>     .maxstack 8
>     L_0000: ldsfld class
> [Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute
> Indiefreaks.Commander.CommanderApplication::__profilerAttribute132
>     L_0005: ldarg.0
>     L_0006: call class [mscorlib]System.Reflection.MethodBase
> [mscorlib]System.Reflection.MethodBase::GetCurrentMethod()
>     L_000b: castclass [mscorlib]System.Reflection.MethodInfo
>     L_0010: callvirt instance void
> [Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute::Profi­lingMethodStart(object,
> class [mscorlib]System.Reflection.MethodInfo)
>     L_0015: ldarg.0
>     L_0016: ldarg.1
>     L_0017: call instance void
> [Indiefreaks.Game.Framework]Indiefreaks.Xna.Core.Application::Draw(class
> [Microsoft.Xna.Framework.Game]Microsoft.Xna.Framework.GameTime)
>     L_001c: ldsfld class
> [Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute
> Indiefreaks.Commander.CommanderApplication::__profilerAttribute132
>     L_0021: call instance void
> [Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilerAttribute::Profi­lingMethodEnd()
>     L_0026: call void
> [Indiefreaks.AOP.Profiler]Indiefreaks.AOP.Profiler.ProfilingManager::Update­()
>     L_002b: ret
>
> }
>
> However, the __profilerAttribute132.ProfilingMethodEnd(); method never
> gets called while ProfilingManager.Update(); does get called.
>
> I don't understand why. Any clue?
> Note that the Application.Draw class calls internally an
> ((IDraw)ActiveGameState).Draw(gameTime); method.
> Here is the Application.Draw code (modified with my injected code):
>
> protected override void Draw(GameTime gameTime)
> {
>     __profilerAttribute464.ProfilingMethodStart(this, (MethodInfo)
> MethodBase.GetCurrentMethod());
>     base.GraphicsDevice.Clear(Color.Black);
>     if (((this._loadingGameState != null) &&
> this._loadingGameState.IsLoadingComplete) && !
> this._loadingGameState.ShouldRenderLoadedGameState)
>     {
>         ((IDraw) this._loadingGameState).Draw(gameTime);
>     }
>     else if ((this.ActiveGameState != null) &&
> this.ActiveGameState.IsLoadingComplete)
>     {
>         ((IDraw) this.ActiveGameState).Draw(gameTime);
>     }
>     if ((this._transitionColor.A != 0f) || (this._transitionColor.A !=
> 1f))
>     {
>         this._transitionRenderer.Begin(SpriteSortMode.Immediate,
> BlendState.AlphaBlend);
>         this._transitionRenderer.Draw(this._transitionTexture,
> base.GraphicsDevice.Viewport.Bounds, this._transitionColor);
>         this._transitionRenderer.End();
>     }
>     base.Draw(gameTime);
>     __profilerAttribute464.ProfilingMethodEnd();
>
> }
>
> My second problem may be related to the 1st one but I'm not sure:
>
> The CommanderApplication.Update normally calls the Application.Update
> method (using base.Update()) which in turns calls the internal
> ((IUpdate)ActiveGameState.Update(gameTime); method.
>
> Here is the code with the profiled injection code:
>
> protected override void Update(GameTime gameTime)
> {
>     __profilerAttribute463.ProfilingMethodStart(this, (MethodInfo)
> MethodBase.GetCurrentMethod());
>     if ((SunBurn.Editor != null) && SunBurn.Editor.EditorAttached)
>     {
>         Input.Enabled = false;
>     }
>     else
>     {
>         Input.Enabled = true;
>     }
>     base.Update(gameTime);
>     this.Threads.Update();
>     Interpolator.Update((float)
> gameTime.ElapsedGameTime.TotalSeconds);
>     Timer.Update((float) gameTime.ElapsedGameTime.TotalSeconds);
>     if (((this.ActiveGameState != null) &&
> this.ActiveGameState.IsLoadingComplete) && ((this._loadingGameState ==
> null) || this._loadingGameState.ShouldRenderLoadedGameState))
>     {
>         ((IUpdate) this.ActiveGameState).Update(gameTime);
>     }
>     if (((this._loadingGameState != null) &&
> this._loadingGameState.IsLoadingComplete) && !
> this._loadingGameState.ShouldRenderLoadedGameState)
>     {
>         ((IUpdate) this._loadingGameState).Update(gameTime);
>     }
>     __profilerAttribute463.ProfilingMethodEnd();
>
> }
>
> What is strange is that the _profilerAttributeXXX.ProfilingEnd()
> methods in CommanderApplication and Application Update methods get
> called before the GameState.Update() one:
>
> Commander.exe Information: 0 : Started Profiling
> CommanderApplication.Update
>     Commander.exe Information: 0 : Started Profiling
> Application.Update
>     Commander.exe Information: 0 : Ended Profiling Application.Update
> Commander.exe Information: 0 : Ended Profiling
> CommanderApplication.Update
> Commander.exe Information: 0 : Started Profiling
> GameState.Indiefreaks.Xna.Core.IUpdate.Update
> ...
> Commander.exe Information: 0 : Ended Profiling
> GameState.Indiefreaks.Xna.Core.IUpdate.Update
>
> I was expecting to get the methods called this way instead (that's the
> way they actually are run by the game):
>
> Commander.exe Information: 0 : Started Profiling
> CommanderApplication.Update
>     Commander.exe Information: 0 : Started Profiling
> Application.Update
>          Commander.exe Information: 0 : Started Profiling
> GameState.Indiefreaks.Xna.Core.IUpdate.Update
>          ...
>          Commander.exe Information: 0 : Ended Profiling
> GameState.Indiefreaks.Xna.Core.IUpdate.Update
>     Commander.exe Information: 0 : Ended Profiling Application.Update
> Commander.exe Information: 0 : Ended Profiling
> CommanderApplication.Update
>
> I hope you can help me understand these behaviors and how I could
> solve them.
> Thanks

-- 
--
mono-cecil

Reply via email to