当前位置: 首页 > 编程语言 > C#

为什么我调用Assembly.GetCallingAssembly()的方法不是JIT内联?

时间:2023-04-11 12:17:35 C#

为什么我对Assembly.GetCallingAssembly()的方法调用不是JIT内联的?我正在尝试制作一个简短的C#片段,该片段将说明由于MSDN中概述的JIT内联而导致的Assembly.GetCallingAssembly()行为发生变化。到目前为止,这是我的代码:控制台.ReadLine();}staticAssemblyGetAssembly(){返回系统。反射.Assembly.GetCallingAssembly();我内置了“Release”并从“StartWithoutDebugging”开始——这个设置使这个答案的代码内联。我看到的结果是ConsoleApplication2,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null显然GetAssembly()没有内联到Main()中,否则我会看到mscorlib调用程序集。我查看了所有内联标准,但我不明白为什么GetAssembly()不会被内联。是否有可能知道为什么JIT编译器决定不内联调用?下面是.NET3.5中Assembly.GetCallingAssembly()的声明:[MethodImpl(MethodImplOptions.NoInlining)]publicstaticAssemblyGetCallingAssembly(){returnnGetExecutingAssembly(reflookForMyCallersCallerenumerationisinteresting,MarkCallers}"FindMyCallerCaller"doesnotworkproperlywhenthecallerisinlined.在CSSCL的SSCLI20源代码中,声明枚举的地方有注释:声明此枚举类型的局部变量并通过ref将其传递给需要执行堆栈爬行的函数也会阻止内联调用[原文如此]并将ESP点传递给堆栈爬行至此非常匹配GetCallingAssembly()中发生的情况,它是一个局部变量这确实是由ref传递的。不确定机制是什么,抖动可以产生一个名为CORINFO_FLG_BAD_INLINEE的方法属性。这反过来会强制调用MethodDesc::SetNotInline()。这是推测,而且非常模糊。添加我的两分钱.不要依赖JIT来做那些可能使你的程序工作的事情。一些禁止JIT能够内联方法的条件如下(取自这里)仅仅因为JIT可以内联一个方法,不这并不意味着它一定会。将其与构建配置/运行时/操作系统组合之间的行为差??异结合起来,嗯......你已经知道了。有关.Net3.5SP1JIT内联行为的更多信息,请单击此处实际上,您对Program.GetAssembly的调用已内联到Program.Main中。但是您看不出区别,因为Program.GetAssembly和Program.Main都是在同一个名为ConsoleApplication2的程序集中定义的。尽管您可以用另一种方式来说明JIT内联:usingSystem;使用系统诊断;命名空间A3{公共类程序{staticvoidMain(string[]args){StackFrame[]stackFrames=GetStackFrames();foreach(StackFramestackFrameinstackFrames)Console.WriteLine(stackFrame.GetMethod().Name);//写方法名Console.ReadLine();}//[MethodImpl(MethodImplOptions.NoInlining)]staticStackFrame[]GetStackFrames(){StackTracestackTrace=newStackTrace();//获取调用栈returnstackTrace.GetFrames();//getmethodcalls(frames)}}}如果没有JIT内联(例如,在调试模式下或[MethodImpl(MethodImplOptions.NoInlining)]属性适用于GetStackFrames),它将至少向控制台写入两行:GetStackFramesMain但是如果发生内联时,stackFrames将只包含一种方法:MainUpdate另外,您可以在此处阅读:DebuggingandHostingProcesses和他在Rawling的评论中提到的:Assembly.GetCallingAssembly()。FullName根据是否启用托管进程返回不同的结果。如果在启用托管进程的情况下调用Assembly.GetCallingAssembly()。全名,返回mscorlib。如果在禁用托管进程的情况下调用Assembly.GetCallingAssembly()。FullName,返回应用程序名称。以上是C#学习教程:WhyismymethodcallingAssembly.GetCallingAssembly()notJITinline?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢