如何检索LoaderException属性?

roz*_*zon 117 .net c# wcf

我在更新服务引用时收到错误消息:

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

如何检索LoaderException属性?

更新:当我重新导入域对象项目时,我的错误消失了.我不知道为什么这会解决这个问题,但我很高兴它正在发挥作用.

KBo*_*oek 137

try
{
  // load the assembly or type
}
catch (Exception ex)
{
  if (ex is System.Reflection.ReflectionTypeLoadException)
  {
    var typeLoadException = ex as ReflectionTypeLoadException;
    var loaderExceptions  = typeLoadException.LoaderExceptions;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • catch子句将捕获所有异常,但只处理ReflectionTypeLoadExceptions.像这样的东西会更好.`catch(ReflectionTypeLoadException ex){var typeLoadException = ex as ReflectionTypeLoadException; var loaderExceptions = typeLoadException.LoaderExceptions; }` (5认同)
  • 我正在尝试使用此解决方案,但我的WCF服务中没有实际包装try块的入口点. (3认同)
  • 如果它与我的代码有任何关系,这个答案对我有用.我在整个`Installer.cs`类中放置了一个`try ... catch`,什么都没有!只有当我尝试执行安装程序时,我的代码才会在运行时抛出此代码.有谁知道**如何检索LoaderExceptions属性以获取更多信息?**喜欢,浏览到文件夹并查看日志文件? (3认同)
  • @ScottMunro:如果您将它作为一种类型来捕获,为什么要创建另一个具有相同类型的变量并进行强制转换?这应该足够了:`catch (ReflectionTypeLoadException ex) { var loaderExceptions = ex.LoaderExceptions; }`。此外,除非您希望强制转换失败并检查是否为空,否则最好进行直接强制转换,以便它立即失败而不是稍后出现空引用异常:`var typeLoadException = (ReflectionTypeLoadException)ex;` (2认同)

Jac*_*lor 73

catch (ReflectionTypeLoadException ex)
{        
    foreach (var item in ex.LoaderExceptions)
    {
          MessageBox.Show(item.Message);                    
    }
}
Run Code Online (Sandbox Code Playgroud)

我很抱歉复活了一个旧线程,但想发布一个不同的解决方案来拉动加载器异常(使用实际的ReflectionTypeLoadException)让其他任何人遇到这个问题.

  • 只是一个FYI,如果你正在运行Win服务(就像我一样),MessageBox将不会出现,因为UI元素会被自动阻止.其余的实施很有帮助.只是保存到日志文件中.谢谢. (2认同)
  • “catch 语句缺少其语句块”。天哪,我讨厌 powershell。 (2认同)

小智 6

在 Visual Studio 中使用 Quick Watch,您可以从抛出异常的 ViewDetails 访问 LoaderExceptions,如下所示:

($exception).LoaderExceptions
Run Code Online (Sandbox Code Playgroud)