Как получить свойство LoaderException?

128

Я получаю сообщение об ошибке при обновлении ссылки на мою службу:

Предупреждение настраиваемого инструмента: невозможно загрузить один или несколько запрошенных типов. Получите свойство LoaderExceptions для получения дополнительных сведений.

Как я могу получить свойство LoaderException?

Обновление: мои ошибки исчезли, когда я повторно импортировал проекты объекта домена. Понятия не имею, почему это устранило проблему, но я рад, что она работает.

rozon
источник
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;
  }
}
KBoek
источник
1
Я отметил вас как ответ, потому что думаю, что это будет наиболее полезно для других, столкнувшихся с этим предупреждением / ошибкой.
rozon
3
Я пытаюсь использовать это решение, но у меня нет точки входа в мою службу WCF, вокруг которой можно было бы обернуть блок попытки.
Jordan
3
Этот ответ сработал бы для меня, если бы он имел какое-либо отношение к моему коду. Я разместил try...catchвокруг всего своего Installer.csкласса, и ничего! Мой код не выдает этого при запуске, только когда я пытаюсь запустить установщик. Кто-нибудь знает, как получить свойство LoaderExceptions для получения дополнительной информации? Например, перейти в папку и просмотреть файл журнала?
jp2code
5
Предложение catch будет перехватывать все исключения, но обрабатывать только исключения ReflectionTypeLoadExceptions. Что-то вроде этого было бы лучше. catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Скотт Манро
1
@ScottMunro: Если вы воспринимаете это как один тип, зачем создавать другую переменную того же типа и выполнять приведение? Этого должно быть достаточно: catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }. Кроме того, если вы не ожидаете, что приведение завершится неудачно и не проверит значение null, лучше выполнить прямое приведение, чтобы оно завершилось неудачей сразу, а не позже с исключением нулевой ссылки:var typeLoadException = (ReflectionTypeLoadException)ex;
Нельсон Ротермел,
74
catch (ReflectionTypeLoadException ex)
{        
    foreach (var item in ex.LoaderExceptions)
    {
          MessageBox.Show(item.Message);                    
    }
}

Мне очень жаль, что я воскресил старую ветку, но хотел опубликовать другое решение, чтобы вытащить исключение загрузчика (используя фактическое исключение ReflectionTypeLoadException), чтобы кто-нибудь еще столкнулся с этим.

Джейкоб Сэйлор
источник
2
Просто к сведению, если вы используете службу Win (например, я), MessageBox не будет отображаться, поскольку элементы пользовательского интерфейса автоматически блокируются. Остальная реализация была полезной. Вместо этого просто сохраняется в файл журнала. Спасибо.
Vippy
1
«В инструкции catch отсутствует блок операторов». Боже, я ненавижу Powershell.
Owl
Большое спасибо, это решение точное, поскольку оно указывает на точную проблему. Нет смысла ловить исключение и ничего не делать.
Мухаммад Ашхар Хасан
5

Используя Quick Watch в Visual Studio, вы можете получить доступ к LoaderExceptions из ViewDetails сгенерированного исключения следующим образом:

($exception).LoaderExceptions
hugo4711
источник
Спасибо! Это заставляет меня задаться вопросом, почему бы не включить эту информацию без необходимости доступа LoaderExceptions, поскольку она действительно содержит соответствующую информацию.
GuiRitter
0

Еще одна альтернатива для тех, кто исследует и / или в интерактивном режиме:

$ Error [0] .Exception.LoaderExceptions

Примечание: [0] берет самую последнюю ошибку из стека.

techsaint
источник