为什么Lambda的MethodBody在调用后会发生变化?

时间:2013-12-11 07:11:22

标签: c# lambda

我想知道是否有人可以向我解释这个问题。 出于某种原因,lambda的MethodBody似乎在调用后会发生变化。

以下代码片段使用一个外部变量生成一个简单的lambda,并检查方法体。

    int x = 7;
    Func<int> f = () => x;

    int before = f.Method.GetMethodBody().GetILAsByteArray().Length;
    f();
    int after = f.Method.GetMethodBody().GetILAsByteArray().Length;

在这种情况下,调用前的长度为11个字节,调用后的长度为126个。

ILDASM将DLL中的lambda主体(在大小写之前)显示为具有预期IL的11个字节:

  IL_0000:  ldarg.0
  IL_0001:  ldfld      int32 Tests.LambdaTest::x
  IL_0006:  stloc.0
  IL_0007:  br.s       IL_0009
  IL_0009:  ldloc.0
  IL_000a:  ret

我没有时间尝试拆解“后”案例(大概)我必须在运行时提取IL以反馈给反汇编程序。我知道它确实包含相关的ldfld。可能如果我确实遇到麻烦可能很明显(?)

这对我来说并不重要,只是想了解发生了什么。

的问候,

安德鲁

1 个答案:

答案 0 :(得分:2)

找到它。

似乎是Telerik JustMock中的代码编织者。

如果我完全禁用加载项,则MethodBody不会改变。

让我有点意外,因为我实际上并没有在这些项目中使用任何模拟。我将不得不检查doco以了解默认情况下JustMock加载项可能正在做什么(如果有的话)。

再次感谢快速响应者,因为他们突出了它在某种程度上是环境的事实。