【问题标题】:How to examine .NET assembly without using reflection如何在不使用反射的情况下检查 .NET 程序集
【发布时间】:2016-11-17 08:10:07
【问题描述】:

假设我们有类BaseDerived,分别在Base.dllDerived.dll 中定义。 Derived 派生自 Base(虽然可能不是直接子类)

手头的问题是,如果我们手头有Derived.dll 但缺少Base.dll,如何以编程方式检查Derived 中的所有类型?例如了解可用的类型、可访问性、继承关系等

根据我的理解,反射(System.Reflection 命名空间中的东西)在这里不是一个选项,因为GetTypes() 将尝试加载不可用的Base.dll,因此抛出ReflectionTypeLoadException

特别是,这是否可以使用Roslyn 或一些好的库轻松实现?

【问题讨论】:

  • 我猜这是不可能的。 .NET 程序集不直接实现基类的类型以支持多态性。
  • 您可能不得不为此使用 Mono.Cecil。 Roslyn 是编译器而不是元数据阅读器(但它必须读取元数据才能进行编译)。但是,您将无法解决所有关系吗?如果有一个基类实现的接口怎么办。您没有该类型信息,因为程序集不可用。
  • 也许这个帖子可以帮助你:stackoverflow.com/questions/2646707/…
  • @elchido 一旦我在一个加载了ReflectionOnlyLoad 的程序集上调用GetTypes(),它仍然会尝试加载它的所有依赖项,因此ReflectionOnlyLoad 在这里不是一个选项。

标签: c# .net dll reflection roslyn


【解决方案1】:

您正在寻找System.Reflection.Metadata,它直接公开程序集元数据,无需通过反射加载程序集。

【讨论】:

    【解决方案2】:

    要研究 .NET 程序集(类型、方法等),您需要从元数据中获取。 Roslyn 这不是您要找的。

    虽然不完全正确,因为 Roslyn 有两种关于您的代码的信息,一种是节点和令牌,另一种是符号。第一个不知道关系信息,但第二个知道。

    无论如何,您可以通过不止一种方式做到这一点。我会写两个。

    1. 使用Mono.Cecil 打开您的程序集,获取主模块并调查您想要的任何内容。

      var allTypesDefinitaion = ModuleDefinition.ReadModule(assemblyPath).Types;
      
    2. 使用CFF Explorer 之类的工具来调查相关的元数据表。 (TypeDef\Ref)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 2011-02-13
      • 2015-12-02
      • 2021-04-23
      • 1970-01-01
      相关资源
      最近更新 更多