У меня есть приложение asp.net, которое рушится. Существует запись для этого в журналах событий Windows, который содержит этот стек вызовов:Нормально ли видеть интерфейс в clr callstack?
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)
Это происходит только на машине клиента, и я не был в состоянии воспроизвести его на месте. Как вы видите сверху, есть интерфейс (ILookup
, который действительно является интерфейсом, а не классом).
Я построил аналогичный образец (метод, называемый через интерфейс). Visual Studio 2015 достаточно умен, чтобы показать это:
ConsoleApplication2.exe!ConsoleApplication2.Lookup.GetLookupId(ConsoleApplication2.ILookup lookup) Line 37 C#
Но там вы все еще видите класс, который реализует метод. Я также привязался к своему образцу с помощью windbg и печатал стек, когда приложение сидит в точке останова в методе, который вызывается через интерфейс: интерфейс не был в стеке.
Вот мой вопрос:
Это нормально, чтобы увидеть интерфейс в CLr стеке вызовов (особенно без класса, который реализует его)? Кажется, я никогда раньше не видел такого коллажа ... Кто-нибудь еще? (Я имею в виду это вообще, независимо от второй части моего вопроса)
Here - очень похожий вопрос: @Hans Passant в своем первом комментарии говорит «неспособность решить метод реализации для метода интерфейса» и OP говорит, что «вы уже ответили на мой вопрос своим первым комментарием». Так это действительно первопричина? Кто-нибудь знает об исправлении для этого? Или это просто специальная версия CLR?
Большое спасибо за объяснение! Это дает понять, почему мы видим интерфейс в верхней части стека. Может быть, один комментарий: «И исправляет машинный код, поэтому адрес CALL заменяется. Поэтому в следующий раз, когда метод выполняется, вы не платите цену за привязку метода «Да, но что, если в следующий раз метод вызывается с другим типом, который реализует интерфейс? Код jitted не может иметь фиксированный вызов для одной реализации. Но в любом случае, я понимаю вашу точку зрения. Еще раз спасибо! – gregkalapos
Да, это та часть, о которой я не знаю. Оно работает. –