关于Assembly.GetCallingAssembly()与方法内联的技术疑问
Assembly.GetCallingAssembly() 内联相关疑问解答
1. M1和M2的内联要求
只需要给直接调用Assembly.GetCallingAssembly()的M1标记[MethodImpl(MethodImplOptions.NoInlining)],不用管M2是否内联。只要M1保持独立不被内联,不管M2有没有被内联到M3里,GetCallingAssembly()都会返回A2——因为调用M1的始终是M2所属的A2程序集代码,哪怕M2的代码被合并到M3中,代码的程序集归属不会变。
如果M1被内联到M2里,这时候结果才会受M2内联状态影响:M2未被内联时,调用GetCallingAssembly()的逻辑等同于M2直接调用它,此时返回的是调用M2的程序集(A3);M2被内联到M3的话,返回调用M3的程序集。
2. 扩展调用链的内联处理
不需要给整条调用链(M3、M4、M5...)都标记禁止内联,核心只需要保证直接调用Assembly.GetCallingAssembly()的那个方法不被内联。只要这个方法是独立存在的,上层调用链的方法无论是否内联,都不会改变GetCallingAssembly()的返回结果——它只会识别到直接调用该方法的程序集。
3. M3内联时的情况
分两种场景:
- M1未被内联:不管M3是否内联,
GetCallingAssembly()都返回A2。原因和第一条一致,M1是独立方法,调用它的是A2的代码,M3内联不改变代码的程序集归属。 - M1被内联到M2:
- 如果M2也被内联到M3,
GetCallingAssembly()的代码会合并到M3中,返回调用M3的方法所在的程序集; - 如果M2未被内联,哪怕M3被内联,调用M2的还是M3所属的A3程序集代码,所以返回A3。
- 如果M2也被内联到M3,
内容的提问来源于stack exchange,提问作者JohnUbuntu
相关产品推荐
相关产品推荐

