您可以在运行时使用前面提到的 GetCurrentMethod 调用来检测它。但是,这似乎有点浪费[1]。最简单的事情就是只 ILDASM 和 MSIL 并在那里检查。
请注意,这专门用于编译器内联调用,并在 MSDN 上的各种反射文档中进行了介绍。
如果调用 GetCallingAssembly 方法的方法被编译器内联扩展(即,如果编译器将函数体插入到发出的 Microsoft 中间语言 (MSIL) 中,而不是发出函数调用),则 GetCallingAssembly 返回的程序集方法是包含内联代码的程序集。这可能与包含原始方法的程序集不同。要确保调用 GetCallingAssembly 方法的方法不被编译器内联,您可以使用 MethodImplOptions.NoInlining 应用 MethodImplAttribute 属性。
然而,JITter 也可以自由地内联调用——但我认为反汇编器将是验证在该级别上做了什么和没有做什么的唯一方法。
编辑:为了澄清这个线程中的一些混乱,csc.exe将内联 MSIL 调用- 尽管 JITter 将(可能)在其中更具侵略性。
[1] 而且,浪费 - 我的意思是 (a) 由于反射查找,它破坏了内联的目的(更好的性能)。并且(b),它可能会改变内联行为,使其不再内联。而且,在您认为您可以使用 Assert 或其他东西打开它之前 - 请意识到它不会在 Debug 期间内联,但可能在 Release 中。