gpt4 book ai didi

c# - 在 clr 调用堆栈中看到接口(interface)是否正常?

转载 作者:太空狗 更新时间:2023-10-29 21:26:54 25 4
gpt4 key购买 nike

我有一个正在崩溃的 asp.net 应用程序。在包含此调用堆栈的 Windows 事件日志中有一个条目:

 Exception type: EntryPointNotFoundException 
Exception message: Entry point was not found.
at ***.Interfaces.Portal.Repository.ILookup.get_LookupDataCollection()
at ***.Portal.Repository.Lookup.GetLookUpValue(ILookup lookup, Int32 index)
at ***.Portal.Repository.Lookup.GetLookUpValue(ILookup lookup)
at ***.HttpModules.RuntimeHttpModule.SetPageUrlInfoInContext(PageUrlInfo pinfo)
at ***PortalRuntime.HttpModules.RuntimeHttpModule.BeginRequest(Object sender, EventArgs e)
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

这只发生在客户机器上,我无法在本地重现它。正如您在顶部看到的那样,有一个接口(interface)(ILookup,它实际上是一个接口(interface),而不是一个类)。

我构建了一个类似的示例(通过接口(interface)调用的方法)。 Visual Studio 2015 足够智能,可以展示这一点:

ConsoleApplication2.exe!ConsoleApplication2.Lookup.GetLookupId(ConsoleApplication2.ILookup lookup) Line 37  C#

但是您仍然可以看到实现该方法的类。我还使用 windbg 附加到我的示例,并在应用程序位于通过接口(interface)调用的方法中的断点时打印堆栈:接口(interface)不在堆栈上。

这是我的问题:

  • 在 clr 调用堆栈中看到接口(interface)是否正常(尤其是没有实现它的类)?我想我以前从未见过这样的调用堆栈……还有其他人吗? (我的意思是一般来说,不管我问题的第二部分)

  • Here是一个非常相似的问题:@Hans Passant 在他的第一条评论中说“无法解析接口(interface)方法的实现方法”,OP 说“你已经用你的第一条评论回答了我的问题”。那么这真的是根本原因吗?有谁知道这个的修复方法?或者它只是一个特殊的 CLR 版本?

最佳答案

我可以解释一下为什么你会看到这个,这对解决你的问题一点帮助都没有。我也不太了解 CLR 将接口(interface)方法绑定(bind)到它们的实现的方式,它是疯狂的微优化。

问题是抖动必须为包含接口(interface)方法调用的方法生成代码。但它还不能知道对象引用的身份。在代码实际执行之前,这并不知道 100% 准确。所以它所做的是分配一个 stub ,一个目标方法的占位符。并为该 stub 生成一条 CALL 指令。该 stub 方法的实际名称是不相关的,当真正的目标方法被解析时它会再次消失。

stub 本身生成对 CLR 的调用以解析目标方法,现在知道对象引用的真实身份以及需要执行哪个具体实现方法。并修补机器代码,以便替换 CALL 地址。因此,下一次方法执行时,您无需支付方法绑定(bind)的代价,并且调用以最大可能的扭曲速度运行。

如前所述, stub 的名称并不重要,因为它是临时的。为其指定接口(interface)方法的名称非常有助于诊断 MissingMethodException。好主意。

真正的问题是加载的程序集不是您构建代码所用的程序集。可能是您忘记重新部署的旧版本。或者您只是在更改界面时忘记重建它,因为它不是解决方案的一部分。所以它没有接口(interface)方法的实现,当 stub 执行时,CLR 很晚才发现这一点。因此,您会在调用堆栈上看到 stub 方法名称。

关于c# - 在 clr 调用堆栈中看到接口(interface)是否正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35038584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com