GetCallingAssembly()和GetExecutingAssembly()是否同样倾向于JIT内联?

时间:2012-10-01 08:05:38

标签: c# .net reflection jit

Assembly.GetExecutingAssembly()Assembly.GetCallingAssembly()。请注意,GetCallingAssembly()有一个Remark提到,根据JIT内联行为的方式,一个方法可能(或没有)内联到另一个方法中,因此GetCallingAssembly()会返回不同的结果。< / p>

现在GetExecutingAssembly()有何不同? JIT内联在技术上可以内联调用GetExecutingAssembly()的代码,因此代码现在属于不同的程序集,并且取决于发生的GetExecutingAssembly()是否也可以产生不同的结果。

为什么GetExecutingAssembly()描述没有提及与GetCallingAssembly()描述类似的JIT内容?

1 个答案:

答案 0 :(得分:13)

GetExecutingAssembly方法不容易受到JIT内联的影响,因为同样的原因MethodBase.GetCurrentMethod也不会受到影响,因为它们是以类似的方式实现的。

两种方法都声明一个特殊枚举StackCrawlMark的局部变量,并将其初始化为StackCrawlMark.LookForMyCaller。这个局部变量的副作用是阻止调用GetExecutingAssemblyGetCurrentMethod的方法被内联,这样可以保证正确的结果。

这可以通过实验以及与SSCLI20中此枚举相关的注释来支持:

// declaring a local var of this enum type and passing it by ref 
// into a function that needs to do a stack crawl will both prevent inlining of 
// the calle and pass an ESP point to stack crawl to
//
// Declaring these in EH clauses is illegal; 
// they must declared in the main method body

GetCallingAssembly易受影响的原因是因为您正在寻找呼叫者的呼叫者,并且局部变量仅保证呼叫者内联,这意味着祖父母方法可以是内联导致意外结果。