Come recuperare la proprietà LoaderException?


128

Ricevo un messaggio di errore durante l'aggiornamento del mio riferimento al servizio:

Avviso strumento personalizzato: impossibile caricare uno o più dei tipi richiesti. Recupera la proprietà LoaderExceptions per ulteriori informazioni.

Come posso recuperare la proprietà LoaderException?

Aggiornamento: i miei errori sono scomparsi quando ho reimportato i progetti di oggetti dominio. Non ho idea del perché ciò abbia risolto il problema, ma sono felice che funzioni.


6
Come sei riuscito a risolvere questo problema? Che cosa intendi con "reimportazione del progetto oggetto dominio"? (rimuovere il riferimento al progetto e aggiungerlo di nuovo?)
Nikos Tsokos l'

Risposte:


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;
  }
}

1
Ti ho contrassegnato come risposta perché penso che sarà molto utile per gli altri che hanno riscontrato questo avviso / errore.
Rozon,

3
Sto cercando di utilizzare questa soluzione, ma non ho un punto di ingresso nel mio servizio WCF attorno al quale avvolgere effettivamente un blocco try.
Giordania,

3
Questa risposta funzionerebbe per me se avesse qualcosa a che fare con il mio codice. Ho messo un try...catchgiro per tutta la mia Installer.csclasse e niente! Il mio codice non lo lancia quando viene eseguito, solo quando provo a eseguire il programma di installazione. Qualcuno sa come recuperare la proprietà LoaderExceptions per ulteriori informazioni? Come, navigare in una cartella e visualizzare un file di registro?
jp2code

5
La clausola catch cattura tutte le eccezioni ma gestisce solo ReflectionTypeLoadExceptions. Qualcosa del genere sarebbe meglio. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro,

1
@ScottMunro: se la prendi come un tipo, perché creare un'altra variabile con lo stesso tipo ed eseguire un cast? Questo dovrebbe essere sufficiente: catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. Inoltre, a meno che non ti aspetti che il cast fallisca e controlli null, è meglio fare un cast diretto in modo che fallisca immediatamente e non successivamente con un'eccezione di riferimento null:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel

74
catch (ReflectionTypeLoadException ex)
{        
    foreach (var item in ex.LoaderExceptions)
    {
          MessageBox.Show(item.Message);                    
    }
}

Mi dispiace per aver resuscitato un vecchio thread, ma volevo pubblicare una soluzione diversa per estrarre l'eccezione del caricatore (utilizzando l'attuale ReflectionTypeLoadException) affinché chiunque altro lo trovasse.


2
Solo una FYI, se si esegue un servizio Win (come me), MessageBox non verrà visualizzato poiché gli elementi dell'interfaccia utente vengono automaticamente bloccati. Il resto dell'implementazione è stato utile. Invece appena salvato in un file di registro. Grazie.
Vippy,

1
"Nell'istruzione catch manca il blocco di istruzioni". Dio, odio il PowerShell.
Gufo

Mille grazie, questa soluzione è accurata in quanto indica il problema esatto. Inutile cogliere l'eccezione e non fare nulla.
Muhammad Ashhar Hasan,

5

Utilizzando Quick Watch in Visual Studio è possibile accedere a LoaderExceptions da ViewDetails dell'eccezione generata in questo modo:

($exception).LoaderExceptions

Grazie! Mi chiedo perché non includere tali informazioni senza la necessità di accedervi LoaderExceptions, poiché in realtà contengono informazioni pertinenti.
GuiRitter

0

Un'altra alternativa per coloro che stanno esplorando e / o in modalità interattiva:

$ error [0] .Exception.LoaderExceptions

Nota: [0] prende l'errore più recente dallo stack

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.