我想知道是否有人可以向我解释这个问题。 出于某种原因,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。可能如果我确实遇到麻烦可能很明显(?)
这对我来说并不重要,只是想了解发生了什么。
的问候,
安德鲁
答案 0 :(得分:2)
找到它。
似乎是Telerik JustMock中的代码编织者。
如果我完全禁用加载项,则MethodBody不会改变。
让我有点意外,因为我实际上并没有在这些项目中使用任何模拟。我将不得不检查doco以了解默认情况下JustMock加载项可能正在做什么(如果有的话)。
再次感谢快速响应者,因为他们突出了它在某种程度上是环境的事实。