如何检索LoaderException属性?


128

更新服务参考时收到错误消息:

自定义工具警告:无法加载一种或多种请求的类型。检索LoaderExceptions属性以获取更多信息。

如何检索LoaderException属性?

更新:重新导入域对象项目时,我的错误消失了。我不知道为什么这可以解决问题,但我很高兴它能正常工作。


6
您如何设法解决此问题?“重新导入域对象项目”是什么意思?(要删除对项目的引用,然后重新添加?)
Nikos Tsokos

Answers:


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 2011年

3
我正在尝试使用此解决方案,但是我的WCF服务中没有入口点,实际上可以围绕该入口点包装try块。
约旦

3
如果该答案与我的代码有任何关系,它将对我有用。我在try...catch整个Installer.cs班级都放了一个,什么也没有!我的代码在运行时不会抛出此错误,只有当我尝试执行安装程序时才会抛出此错误。有谁知道如何获取LoaderExceptions属性以获取更多信息?喜欢,浏览到文件夹并查看日志文件?
jp2code 2013年

5
catch子句将捕获所有异常,但仅处理ReflectionTypeLoadExceptions。这样的事情会更好。catch (ReflectionTypeLoadException ex) { var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }
Scott Munro

1
@ScottMunro:如果您将其作为一种类型捕获,为什么还要创建具有相同类型的另一个变量并进行强制转换?这应该满足:catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }。另外,除非您预计转换会失败并且将检查是否为null,否则最好直接进行转换,这样它将立即失败,并且以后不会出现null引用异常:var typeLoadException = (ReflectionTypeLoadException)ex;
Nelson Rothermel 2014年

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

很抱歉,我恢复了旧线程,但想发布其他解决方案来拉出加载程序异常(使用实际的ReflectionTypeLoadException),以供其他任何人遇到。


2
仅供参考,如果您正在运行Win Service(如我),MessageBox将不会出现,因为UI元素会自动被阻止。其余的实施很有帮助。而是保存到日志文件中。谢谢。
Vippy

1
“ catch语句缺少其语句块”。天哪,我讨厌powershell。
猫头鹰

非常感谢,此解决方案非常准确,因为它可以指出确切的问题。捕获异常毫无意义,无所作为。
穆罕默德·阿什哈·哈桑

5

使用Visual Studio中的快速监视,您可以从抛出的异常的ViewDetails访问LoaderExceptions,如下所示:

($exception).LoaderExceptions

谢谢!我想知道为什么不包含这些信息而无需访问LoaderExceptions,因为它实际上包含相关信息。
GuiRitter

0

对于正在和/或处于交互模式下进行探测的用户,另一个替代方案是:

$ Error [0] .Exception.LoaderExceptions

注意:[0]获取堆栈中的最新错误

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.