¿Cómo recuperar la propiedad LoaderException?

128

Recibo un mensaje de error al actualizar mi referencia de servicio:

Advertencia de herramienta personalizada: no se puede cargar uno o más de los tipos solicitados. Recupere la propiedad LoaderExceptions para obtener más información.

¿Cómo puedo recuperar la propiedad LoaderException?

Actualización: Mis errores desaparecieron cuando reimporté los proyectos de objetos de dominio. No tengo idea de por qué esto solucionó el problema, pero estoy feliz de que esté funcionando.

rozon
fuente
66
¿Cómo lograste arreglar esto? ¿Qué quiere decir con "reimportar proyecto de objeto de dominio"? (¿eliminar la referencia al proyecto y volver a agregarlo nuevamente?)
Nikos Tsokos

Respuestas:

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
fuente
1
Te marqué como respuesta porque creo que será de gran ayuda para otros que experimenten esta advertencia / error.
rozon
3
Estoy tratando de usar esta solución, pero no tengo un punto de entrada en mi servicio WCF alrededor del cual envolver un bloque de prueba.
Jordan
3
Esta respuesta funcionaría para mí si tuviera algo que ver con mi código. He colocado un try...catchalrededor de toda mi Installer.csclase, ¡y nada! Mi código no arroja esto cuando se ejecuta, solo cuando intento ejecutar el instalador. ¿Alguien sabe cómo recuperar la propiedad LoaderExceptions para obtener más información? Por ejemplo, ¿buscar una carpeta y ver un archivo de registro?
jp2code
55
La cláusula catch capturará todas las excepciones, pero solo manejará ReflectionTypeLoadExceptions. Algo como esto sería mejor. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro
1
@ScottMunro: Si lo está capturando como un tipo, ¿por qué crear otra variable con el mismo tipo y hacer un reparto? Esto debería ser suficiente: catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. Además, a menos que espere que el elenco falle y verifique si es nulo, es mejor hacer un elenco directo para que falle inmediatamente y no más tarde con una excepción de referencia nula:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel
74
catch (ReflectionTypeLoadException ex)
{        
    foreach (var item in ex.LoaderExceptions)
    {
          MessageBox.Show(item.Message);                    
    }
}

Lo siento por resucitar un hilo antiguo, pero quería publicar una solución diferente para extraer la excepción del cargador (Usar el ReflectionTypeLoadException real) para que alguien más se encuentre con esto.

Jacob Saylor
fuente
2
Solo para su información, si está ejecutando un servicio Win (como yo), MessageBox no aparecerá ya que los elementos de la interfaz de usuario se bloquean automáticamente. El resto de la implementación fue útil. Simplemente guardado en un archivo de registro en su lugar. Gracias.
Vippy
1
"La instrucción catch no tiene su bloque de instrucciones". Dios, odio el PowerShell.
Búho
Muchas gracias, esta solución es precisa ya que señala el problema exacto. No tiene sentido atrapar la excepción y no hacer nada.
Muhammad Ashhar Hasan
5

Utilizando Quick Watch en Visual Studio, puede acceder a LoaderExceptions desde ViewDetails de la excepción lanzada como esta:

($exception).LoaderExceptions
hugo4711
fuente
¡Gracias! Me hace preguntarme por qué no incluir esa información sin la necesidad de acceder LoaderExceptions, ya que en realidad contiene información relevante.
GuiRitter
0

Otra alternativa para aquellos que están explorando y / o en modo interactivo:

$ Error [0] .Exception.LoaderExceptions

Nota: [0] toma el error más reciente de la pila

techsaint
fuente