【问题标题】:Assembly.GetTypes() - Get the types which fail to loadAssembly.GetTypes() - 获取加载失败的类型
【发布时间】:2012-04-04 15:44:19
【问题描述】:

当存在无法加载的类型时,Assembly.GetTypes() 会引发 ReflectionTypeLoadException。

该异常有一个 Types[] 属性列出了成功加载的类型,还有一个 LoaderExceptions[] 属性列出了加载失败的类型的异常。

我的问题:如何获取与 LoaderExceptions 对应的类型本身?

编辑:我实际上是在寻找无法加载的类型的 name。很抱歉有任何混乱。

【问题讨论】:

  • 您必须解决 LoaderExceptions。它们是什么?
  • 你看过这个stackoverflow.com/questions/2658275/…了吗 - 这似乎是一个奇怪的错误,你到底在做什么,组装来自哪里,是你的还是第3方等等。你试过了吗反射器或类似物。
  • LoaderExceptions 在这种情况下是 FileLoadExceptions,它只发生在我无权访问的最终用户的机器上。 FileLoadException 位于第 3 方 dll 上。我实际上必须进行生产构建并让这个人运行它并失败只是为了获取更多日志以便我可以调试。获得这么多信息已经进行了 3 轮。

标签: c# typeloadexception


【解决方案1】:

这是不可能的。 CLR 未能创建Type 对象,这就是您获得LoaderExceptions 集的原因。根本没有 Type 对象来描述无法加载的 Type

【讨论】:

  • 很公平,我应该将其表述为“如何获取无法加载的类型的类型名称?”在这种情况下,LoaderExceptions 具有 FileLoadExceptions,它具有关联的融合日志,但由于此异常,实际上没有任何内容显示“type Peters.BrokenClass”无法加载:.. 只是该程序集Something.From.MS.dll 未能加载...
  • @PeterDrier 这是一个令人沮丧的例外情况。我通常直接使用 fuslogvw 来追踪错误,因为它偶尔会提供更多有用的信息msdn.microsoft.com/en-us/library/e74a18c4(v=VS.71).aspx
  • 如果我能访问有问题的机器就好了。它在现场,用户不是我们更快乐的人之一。唯一真正的选择是在额外的调试中编写代码,然后将足够的结果记录回服务器以希望找出问题所在。
【解决方案2】:

当您从某个位置加载的 Dll 已在您的应用程序或父应用程序中引用时,通常会发生此错误。如果 Dll 已经在引用中,则循环访问应用程序的 Assemblies

foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
      if (asm.ManifestModule.FullyQualifiedName.EndsWith("YourDllName.dll"))
      {
            foreach (var Type in asm.GetTypes())
            {
                  // Apply your logic here
            }                
            break;
      }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多