Comment récupérer la propriété LoaderException?

128

Je reçois un message d'erreur lors de la mise à jour de ma référence de service:

Avertissement relatif à l'outil personnalisé: impossible de charger un ou plusieurs des types demandés. Récupérez la propriété LoaderExceptions pour plus d'informations.

Comment puis-je récupérer la propriété LoaderException?

Mise à jour: Mes erreurs ont disparu lorsque j'ai réimporté les projets d'objet de domaine. Je n'ai aucune idée de pourquoi cela a résolu le problème, mais je suis heureux que cela fonctionne.

rozon
la source
6
Comment avez-vous réussi à résoudre ce problème? Qu'entendez-vous par «réimportation du projet d'objet de domaine»? (supprimer la référence au projet et l'ajouter à nouveau?)
Nikos Tsokos

Réponses:

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
la source
1
Je vous ai marqué comme réponse car je pense que ce sera très utile pour les autres personnes confrontées à cet avertissement / erreur.
rozon le
3
J'essaie d'utiliser cette solution, mais je n'ai pas de point d'entrée dans mon service WCF autour duquel envelopper un bloc try.
Jordanie
3
Cette réponse fonctionnerait pour moi si elle avait quelque chose à voir avec mon code. J'ai placé un try...catchautour de toute ma Installer.csclasse, et rien! Mon code ne le lance pas lorsqu'il s'exécute, uniquement lorsque j'essaye d'exécuter le programme d'installation. Quelqu'un sait-il comment récupérer la propriété LoaderExceptions pour plus d'informations? Par exemple, accédez à un dossier et affichez un fichier journal?
jp2code
5
La clause catch intercepte toutes les exceptions mais ne gère que les exceptions ReflectionTypeLoadExceptions. Quelque chose comme ça serait mieux. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro
1
@ScottMunro: Si vous l'attrapez comme un type, pourquoi créer une autre variable avec le même type et faire un cast? Cela devrait suffire: catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. De plus, à moins que vous ne vous attendiez à ce que la distribution échoue et que vous vérifiiez la valeur nulle, il est préférable de faire une distribution directe afin qu'elle échoue immédiatement et pas plus tard avec une exception de référence nulle:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel
74
catch (ReflectionTypeLoadException ex)
{        
    foreach (var item in ex.LoaderExceptions)
    {
          MessageBox.Show(item.Message);                    
    }
}

Je suis désolé d'avoir ressuscité un ancien thread, mais je voulais publier une solution différente pour extraire l'exception du chargeur (en utilisant la réelle ReflectionTypeLoadException) pour que quelqu'un d'autre rencontre cela.

Jacob Saylor
la source
2
Juste un FYI, si vous exécutez un service Win (comme moi), MessageBox n'apparaîtra pas car les éléments de l'interface utilisateur sont automatiquement bloqués. Le reste de la mise en œuvre a été utile. Juste enregistré dans un fichier journal à la place. Merci.
Vippy
1
"L'instruction catch n'a pas son bloc d'instructions". Dieu, je déteste PowerShell.
Owl
Merci beaucoup, cette solution est précise car elle identifie le problème exact. Inutile d'attraper l'exception et de ne rien faire.
Muhammad Ashhar Hasan le
5

À l'aide de Quick Watch dans Visual Studio, vous pouvez accéder aux LoaderExceptions à partir de ViewDetails de l'exception levée comme ceci:

($exception).LoaderExceptions
hugo4711
la source
Merci! Je me demande pourquoi ne pas inclure ces informations sans y avoir accès LoaderExceptions, car elles contiennent en fait des informations pertinentes.
GuiRitter
0

Une autre alternative pour ceux qui explorent et / ou en mode interactif:

$ Erreur [0] .Exception.LoaderExceptions

Remarque: [0] récupère l'erreur la plus récente de la pile

techsaint
la source