Як отримати властивість LoaderException?


128

Під час оновлення своєї служби обслуговування я отримую повідомлення про помилку:

Спеціальне попередження інструменту: не вдається завантажити один або кілька запитуваних типів. Отримайте властивість LoaderExceptions для отримання додаткової інформації.

Як я можу отримати властивість LoaderException?

Оновлення: мої помилки усунулися, коли я повторно імпортував проекти об’єктів домену. Я поняття не маю, чому це вирішило проблему, але я щасливий, що це працює.


6
Як вам вдалося це виправити? Що ви маєте на увазі під "реімпортуванням об'єкта доменних об'єктів"? (видалити посилання на проект і знову додати його знову?)
Нікос Цокос

Відповіді:


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
Я позначив вас як відповідь, оскільки думаю, що це буде найбільш корисним для інших, хто відчуває це попередження / помилку.
rozon

3
Я намагаюся використовувати це рішення, але у мене в службі WCF немає точки входу, навколо якої насправді слід обернути блок проб.
Йорданія

3
Ця відповідь спрацювала б для мене, якби вона мала щось стосується мого коду. Я розмістив try...catchнавколо себе весь Installer.csклас, і нічого! Мій код не кидає це під час його запуску, лише коли я намагаюся виконати Інсталятор. Хтось знає, як отримати властивість LoaderExceptions для отримання додаткової інформації? Мовляв, перейти до папки та переглянути файл журналу?
jp2code

5
У пункті вилучення містяться всі винятки, але лише обробляються ReflectionTypeLoadExceptions. Щось подібне було б краще. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Скотт Манро

1
@ScottMunro: Якщо ви вловлюєте це як один тип, навіщо створювати ще одну змінну з тим же типом і робити анотацію? Цього має бути достатньо: catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. Крім того, якщо ви не очікуєте, що виступ буде невдалим і перевірятиметься на нуль, краще зробити прямий ролик, щоб він вийшов з ладу негайно, а не пізніше, з нульовим посиланням на виняток:var typeLoadException = (ReflectionTypeLoadException)ex;
Нельсон Ротермель

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

Вибачте за те, що воскресив стару тему, але хотів опублікувати інше рішення, щоб витягнути виняток із завантажувача (Використовуючи фактичне ReflectionTypeLoadException) для інших, хто натрапив на це.


2
Просто FYI, якщо ви користуєтеся службою Win (як я), MessageBox не з’явиться, оскільки елементи інтерфейсу автоматично блокуються. Решта реалізації була корисною Просто замість цього збережено у файл журналу. Дякую.
Vippy

1
"У заяві про вилов відсутній блок його заяв". Боже, я ненавиджу владу.
Сова

Дякую, це рішення є точним, оскільки воно вказує на точну проблему. Немає сенсу ловити виняток і нічого не робити.
Мухаммед Ашар Хасан

5

За допомогою швидкого перегляду у Visual Studio ви можете отримати доступ до LoaderExceptions з ViewDetails викинутого винятку, як це:

($exception).LoaderExceptions

Дякую! Мене здивує, чому б не включити цю інформацію без необхідності доступу LoaderExceptions, оскільки вона насправді містить відповідну інформацію.
GuiRitter

0

Ще одна альтернатива для тих, хто пробує навколо та / або в інтерактивному режимі:

$ Помилка [0] .Exception.LoaderExceptions

Примітка: [0] захоплює останню помилку зі стека

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.