Como recuperar a propriedade LoaderException?


128

Recebo uma mensagem de erro ao atualizar minha referência de serviço:

Aviso de ferramenta personalizada: não foi possível carregar um ou mais dos tipos solicitados. Recupere a propriedade LoaderExceptions para obter mais informações.

Como posso recuperar a propriedade LoaderException?

Atualização: meus erros desapareceram quando reimportei os projetos de objetos de domínio. Não tenho idéia do por que isso resolveu o problema, mas estou feliz que esteja funcionando.


6
Como você conseguiu consertar isso? O que você quer dizer com "reimportando o projeto de objeto de domínio"? (referência de remoção para o projeto e re add-lo novamente?)
Nikos Tsokos

Respostas:


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
Marquei você como resposta porque acho que será mais útil para outras pessoas que enfrentam esse aviso / erro.
Rozon

3
Estou tentando usar esta solução, mas não tenho ponto de entrada no meu serviço WCF em torno do qual realmente quebrar um bloco de tentativa.
Jordânia

3
Essa resposta funcionaria para mim se tivesse algo a ver com o meu código. Eu coloquei um em try...catchtorno de toda a minha Installer.csclasse, e nada! Meu código não lança isso quando é executado, apenas quando tento executar o Instalador. Alguém sabe como recuperar a propriedade LoaderExceptions para obter mais informações? Como, navegue até uma pasta e visualize um arquivo de log?
Jp2code

5
A cláusula catch captura todas as exceções, mas manipula apenas ReflectionTypeLoadExceptions. Algo assim seria melhor. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro

1
@ ScottMunro: Se você está pegando como um tipo, por que criar outra variável com o mesmo tipo e fazer uma conversão? Isso deve ser suficiente: catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. Além disso, a menos que você espera que o elenco para falhar e irá verificar se há nula, é melhor fazer um elenco direta para que ele irá falhar imediatamente e não mais tarde, com uma exceção de referência nula:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel

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

Sinto muito por ressuscitar um thread antigo, mas queria postar uma solução diferente para gerar a exceção do carregador (usando o ReflectionTypeLoadException real) para que qualquer outra pessoa se deparasse com isso.


2
Apenas um FYI, se você estiver executando um Serviço Win (como eu), o MessageBox não aparecerá como os elementos da interface do usuário são bloqueados automaticamente. O restante da implementação foi útil. Apenas salvo em um arquivo de log. Obrigado.
Vippy

1
"A instrução catch está faltando no seu bloco de instruções". Deus, eu odeio PowerShell.
coruja

Muito obrigado, esta solução é precisa, pois aponta o problema exato. Não faz sentido pegar a exceção e não fazer nada.
Muhammad Ashhar Hasan

5

Usando o Quick Watch no Visual Studio, você pode acessar as LoaderExceptions de ViewDetails da exceção lançada assim:

($exception).LoaderExceptions

Obrigado! Me faz pensar por que não incluir essas informações sem a necessidade de acessar LoaderExceptions, pois elas realmente contêm informações relevantes.
GuiRitter 30/04

0

Outra alternativa para aqueles que estão investigando e / ou no modo interativo:

$ Erro [0] .Exception.LoaderExceptions

Nota: [0] pega o erro mais recente da pilha

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.