Mam aplikację asp.net, która ulega awarii. Jest wejście na ten cel w dziennikach zdarzeń okna, które zawiera ten callstack:Czy to normalne, widzieć interfejs w kliencie call clr?
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)
Dzieje się tak tylko na komputerze klienta i nie byłem w stanie odtworzyć go lokalnie. Jak widać na górze jest interfejs (ILookup
, który jest naprawdę interfejsem, a nie klasą).
Zbudowałem podobną próbkę (metoda wywołana przez interfejs). Visual Studio 2015 jest wystarczająco inteligentny, aby to pokazać:
ConsoleApplication2.exe!ConsoleApplication2.Lookup.GetLookupId(ConsoleApplication2.ILookup lookup) Line 37 C#
Ale nadal widzisz klasę, która implementuje tę metodę. Dołączałem także do mojej próbki z windbg i drukowałem stos, gdy aplikacja znajduje się w punkcie przerwania w metodzie, która została wywołana przez interfejs: interfejs nie był na stosie.
Oto moje pytanie:
Czy to normalne, aby zobaczyć interfejs w callstack clr (zwłaszcza bez klasy, która implementuje go)? Chyba nigdy wcześniej nie widziałem takiego stożka ... Ktoś jeszcze? (Mam na myśli to ogólnie, niezależnie od drugiej części mojego pytania)
Here to bardzo podobne pytanie: @Hans Passant w swoim pierwszym komentarzu mówi "brak rozwiązania metody implementacji dla metody interfejsu" i OP mówi, że "już odpowiedziałeś na moje pytanie swoim pierwszym komentarzem". Czy to naprawdę jest główna przyczyna? Czy ktoś wie o poprawce? A może jest to tylko specjalna wersja CLR?
Wielkie dzięki za wyjaśnienie! Jasno wyjaśnia, dlaczego widzimy interfejs na szczycie stosu. Może jeden komentarz: "I łata kod maszynowy, aby adres CALL został zastąpiony. Tak więc przy następnym wykonaniu metody nie zapłacisz ceny metody wiązania "Tak, ale co jeśli następnym razem metoda zostanie wywołana z innego typu, który implementuje interfejs? Zrobiony kod nie może mieć połączenia z poprawką do jednej implementacji. Ale w każdym razie, rozumiem twój punkt widzenia. Dzięki jeszcze raz! – gregkalapos
Ta część, o której nie wiem wystarczająco dużo. To działa. –