Jak pobrać właściwość LoaderException?

128

Otrzymuję komunikat o błędzie podczas aktualizowania numeru referencyjnego usługi:

Ostrzeżenie narzędzia niestandardowego: nie można załadować co najmniej jednego z żądanych typów. Aby uzyskać więcej informacji, pobierz właściwość LoaderExceptions.

Jak mogę pobrać właściwość LoaderException?

Aktualizacja: moje błędy zniknęły, gdy ponownie zaimportowałem projekty obiektów domeny. Nie mam pojęcia, dlaczego to rozwiązało problem, ale cieszę się, że działa.

rozon
źródło
6
Jak udało ci się to naprawić? Co masz na myśli przez „ponowne zaimportowanie projektu obiektu domeny”? (usunąć odniesienie do projektu i dodać je ponownie?)
Nikos Tsokos

Odpowiedzi:

142
try
{
  // load the assembly or type
}
catch (Exception ex)
{
  if (ex is System.Reflection.ReflectionTypeLoadException)
  {
    var typeLoadException = ex as ReflectionTypeLoadException;
    var loaderExceptions  = typeLoadException.LoaderExceptions;
  }
}
KBoek
źródło
1
Oznaczyłem Cię jako odpowiedź, ponieważ myślę, że będzie to najbardziej pomocne dla innych osób doświadczających tego ostrzeżenia / błędu.
rozon
3
Próbuję użyć tego rozwiązania, ale nie mam punktu wejścia w mojej usłudze WCF, wokół którego można faktycznie zawinąć blok try.
Jordan
3
Ta odpowiedź zadziałałaby dla mnie, gdyby miała coś wspólnego z moim kodem. Umieściłem try...catchwokół całej mojej Installer.csklasy i nic! Mój kod nie zgłasza tego, gdy jest uruchomiony, tylko wtedy, gdy próbuję uruchomić Instalatora. Czy ktoś wie, jak pobrać właściwość LoaderExceptions, aby uzyskać więcej informacji? Podoba Ci się, przejść do folderu i wyświetlić plik dziennika?
jp2code
5
Klauzula catch przechwytuje wszystkie wyjątki, ale obsługuje tylko ReflectionTypeLoadExceptions. Coś takiego byłoby lepsze. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro
1
@ScottMunro: Jeśli łapiesz to jako jeden typ, po co tworzyć inną zmienną tego samego typu i rzucać? To powinno wystarczyć: catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. Ponadto, jeśli nie spodziewasz się, że rzutowanie się nie powiedzie i będzie sprawdzać, czy nie ma wartości null, lepiej wykonać rzut bezpośredni, aby zakończył się niepowodzeniem natychmiast, a nie później, z wyjątkiem zerowego odniesienia:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel
74
catch (ReflectionTypeLoadException ex)
{        
    foreach (var item in ex.LoaderExceptions)
    {
          MessageBox.Show(item.Message);                    
    }
}

Przepraszam za wskrzeszenie starego wątku, ale chciałem opublikować inne rozwiązanie, aby wyciągnąć wyjątek modułu ładującego (przy użyciu rzeczywistego ReflectionTypeLoadException), aby ktokolwiek inny mógł się z tym spotkać.

Jacob Saylor
źródło
2
Tylko do Twojej wiadomości, jeśli korzystasz z usługi Win (tak jak ja), MessageBox nie pojawi się, ponieważ elementy interfejsu użytkownika są automatycznie blokowane. Reszta wdrożenia była pomocna. Zamiast tego został właśnie zapisany w pliku dziennika. Dzięki.
Vippy
1
„W instrukcji catch brakuje bloku instrukcji”. Boże, nienawidzę PowerShell.
Sowa
Wielkie dzięki, to rozwiązanie jest dokładne, ponieważ wskazuje dokładny problem. Nie ma sensu łapać wyjątku i nic nie robić.
Muhammad Ashhar Hasan
5

Korzystając z funkcji Quick Watch w programie Visual Studio, można uzyskać dostęp do LoaderExceptions z ViewDetails z rzuconego wyjątku w następujący sposób:

($exception).LoaderExceptions
hugo4711
źródło
Dzięki! Zastanawiam się, dlaczego nie uwzględnić tych informacji bez konieczności dostępu LoaderExceptions, ponieważ w rzeczywistości zawierają one istotne informacje.
GuiRitter
0

Kolejna alternatywa dla tych, którzy szukają informacji w pobliżu i / lub w trybie interaktywnym:

$ Error [0] .Exception.LoaderExceptions

Uwaga: [0] pobiera najnowszy błąd ze stosu

techsaint
źródło