Wie rufe ich die LoaderException-Eigenschaft ab?

128

Beim Aktualisieren meiner Servicereferenz wird eine Fehlermeldung angezeigt:

Benutzerdefinierte Tool-Warnung: Einer oder mehrere der angeforderten Typen können nicht geladen werden. Rufen Sie die LoaderExceptions-Eigenschaft ab, um weitere Informationen zu erhalten.

Wie kann ich die LoaderException-Eigenschaft abrufen?

Update: Meine Fehler sind verschwunden, als ich die Domänenobjektprojekte erneut importiert habe. Ich habe keine Ahnung, warum dies das Problem behoben hat, aber ich bin froh, dass es funktioniert.

Rozon
quelle
6
Wie haben Sie das behoben? Was meinst du mit "Domain-Objekt-Projekt erneut importieren"? (Verweis auf das Projekt entfernen und erneut hinzufügen?)
Nikos Tsokos

Antworten:

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
quelle
1
Ich habe Sie als Antwort markiert, da ich denke, dass dies für andere, die von dieser Warnung / diesem Fehler betroffen sind, am hilfreichsten ist.
Rozon
3
Ich versuche, diese Lösung zu verwenden, habe aber keinen Einstiegspunkt in meinen WCF-Dienst, um den ein Try-Block tatsächlich gewickelt werden kann.
Jordanien
3
Diese Antwort würde für mich funktionieren, wenn sie etwas mit meinem Code zu tun hätte. Ich habe eine try...catchum meine gesamte Installer.csKlasse gelegt und nichts! Mein Code löst dies nicht aus, wenn er ausgeführt wird, sondern nur, wenn ich versuche, das Installationsprogramm auszuführen. Weiß jemand, wie man die LoaderExceptions-Eigenschaft abruft, um weitere Informationen zu erhalten? Möchten Sie zu einem Ordner navigieren und eine Protokolldatei anzeigen?
JP2-Code
5
Die catch-Klausel fängt alle Ausnahmen ab, behandelt jedoch nur ReflectionTypeLoadExceptions. So etwas wäre besser. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro
1
@ScottMunro: Wenn Sie es als einen Typ abfangen, warum sollten Sie dann eine andere Variable mit demselben Typ erstellen und eine Umwandlung durchführen? Dies sollte ausreichen : catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. Wenn Sie nicht erwarten, dass die Umwandlung fehlschlägt und auf Null überprüft wird, ist es besser, eine direkte Umwandlung durchzuführen, damit sie sofort und nicht später mit einer Nullreferenzausnahme fehlschlägt:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel
74
catch (ReflectionTypeLoadException ex)
{        
    foreach (var item in ex.LoaderExceptions)
    {
          MessageBox.Show(item.Message);                    
    }
}

Es tut mir leid, dass ich einen alten Thread wiederbelebt habe, aber ich wollte eine andere Lösung veröffentlichen, um die Loader-Ausnahme (unter Verwendung der tatsächlichen ReflectionTypeLoadException) auszulösen, damit andere Personen darauf stoßen können.

Jacob Saylor
quelle
2
Nur zu Ihrer Information: Wenn Sie einen Win-Dienst ausführen (wie ich), wird MessageBox nicht angezeigt, da UI-Elemente automatisch blockiert werden. Der Rest der Implementierung war hilfreich. Stattdessen einfach in einer Protokolldatei gespeichert. Vielen Dank.
Vippy
1
"Der catch-Anweisung fehlt der Anweisungsblock". Gott, ich hasse Powershell.
Eule
Vielen Dank, diese Lösung ist genau, da sie das genaue Problem genau bestimmt. Es macht keinen Sinn, die Ausnahme zu fangen und nichts zu tun.
Muhammad Ashhar Hasan
5

Mit Quick Watch in Visual Studio können Sie über ViewDetails der ausgelösten Ausnahme wie folgt auf die LoaderExceptions zugreifen:

($exception).LoaderExceptions
hugo4711
quelle
Vielen Dank! Ich frage mich, warum ich diese Informationen nicht ohne Zugriff einschließen muss LoaderExceptions, da sie tatsächlich relevante Informationen enthalten.
GuiRitter
0

Eine weitere Alternative für diejenigen, die sich im interaktiven Modus umsehen: /

$ Error [0] .Exception.LoaderExceptions

Hinweis: [0] holt den letzten Fehler vom Stapel

Techsaint
quelle