【问题标题】:How to get name of type contained within missing assembly如何获取缺少的程序集中包含的类型名称
【发布时间】:2011-08-13 21:19:55
【问题描述】:

我已在ReflectionOnly 上下文中加载程序集A,以便获取有关类型及其方法的信息。至少有一个方法的返回类型是依赖程序集B 的一部分。

问题是程序集B 不可用且无法解析,因此会抛出以下FileNotFoundException

无法加载文件或程序集“B”或其依赖项之一。 系统找不到指定的文件。

这种异常是意料之中的。但是,我已经看到 Reflector CAN 加载类型名称(这是我需要的),即使它无法解析依赖程序集。

有人知道如何在不获取FileNotFoundException 的情况下获取缺少的程序集中包含的类型名称吗?

编辑:

尝试访问ReturnType属性时抛出异常:

Type returnType = methodInfo.ReturnType;

【问题讨论】:

  • 您能否发布一个代码示例并告诉我们究竟是哪一行引发了异常?
  • 我不相信反射器使用反射 API ......它通过直接检查 IL 来构建自己的代码域
  • 您会发现 Lutz Roeder 是一个非常酷的程序员。他没有使用Type,他直接解析程序集元数据。 Chuck Norris 也使用 IMetaDataAssemblyImport。
  • @Hans:我不确定 Lutz Roeder 是否真的做到了。出于某种原因,我认为他使用了Mono.Cecil :)

标签: c# .net reflection


【解决方案1】:

您可以尝试使用不同的库来加载此程序集,例如 Mono.Cecil

【讨论】:

    【解决方案2】:

    好的...有一个“奇怪”的可能解决方案,我说它是“奇怪的”。

    每次您尝试加载在 AppDomain 中找不到的类时,都会引发 AppDomain.TypeResolve 事件。

    See the MSDN page

    现在...为了简单起见,我们暂时将多线程和多个应用程序域问题分开,但是如果您向 AppDomain.Current.TypeResolve 添加处理程序,您可以找到缺少的类的名称。

    【讨论】:

    • TypeResolve 事件未触发。根据 MSDN,“......如果在静态程序集中找不到类型,则不会发生此事件,因为运行时知道类型不能动态添加到静态程序集中。”。似乎反射的程序集是一个静态程序集。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多