我在应用程序中观察到很多“堆栈内省”代码,这些代码通常隐含地依赖于它们的包含方法,而不是为了它们的正确性而内联。此类方法通常涉及调用:
MethodBase.GetCurrentMethod
Assembly.GetCallingAssembly
Assembly.GetExecutingAssembly
现在,我发现围绕这些方法的信息非常混乱。我听说运行时不会内联调用 GetCurrentMethod 的方法,但我找不到任何相关文档。我曾多次在 StackOverflow 上看到过帖子,例如这个,表明 CLR 没有内联跨汇编调用,但GetCallingAssembly
文档强烈表明并非如此。
还有饱受诟病的[MethodImpl(MethodImplOptions.NoInlining)]
,但我不确定 CLR 是否认为这是“请求”或“命令”。
请注意,我从合同的角度询问内联资格,而不是关于 JITter 的当前实现何时因实施困难而拒绝考虑方法,或者 JITter在评估交易后最终最终选择内联合格方法的时间 -关闭。我读过这个和这个,但他们似乎更关注最后两点(有提到 MethodImpOptions.NoInlining 和“exotic IL instructions”,但这些似乎是作为启发式而不是作为义务提出的)。
什么时候允许CLR内联?