我观察到许多应用程序中存在很多"堆栈内省"的代码,这些代码通常会隐式依赖于其包含方法不被内联以确保其正确性。这些方法通常涉及以下调用:
MethodBase.GetCurrentMethod
Assembly.GetCallingAssembly
Assembly.GetExecutingAssembly
现在,我发现这些方法周围的信息非常令人困惑。我听说运行时不会内联调用GetCurrentMethod的方法,但是我找不到任何相关文档。我在StackOverflow上看到了一些帖子,比如这个,表明CLR不会内联跨程序集的调用,但是GetCallingAssembly
的文档强烈表示相反。
还有备受诟病的[MethodImpl(MethodImplOptions.NoInlining)]
,但我不确定CLR是否认为这是一个"请求"还是一个"命令"。
请注意,我询问的是从契约角度来看内联的资格,而不是关于当当前JITter实现由于实现难度而拒绝考虑方法的情况,或者关于当JITter最终在评估权衡后选择内联一个符合条件的方法的情况。我阅读了这个和这个,但它们似乎更注重于后面两点(虽然提到了MethodImpOptions.NoInlining和"异国情调的IL指令",但这些似乎被呈现为启发式而不是义务)。
何时允许CLR进行内联?
[MethodImpl(MethodImpOptions.NoInlining)]
修饰符,否则Assembly.GetExecutingAssembly
会出问题? - Ani