2016-11-17 63 views
0

假设我们有BaseDerived,分别在Base.dllDerived.dll中定义。 DerivedBase导出(可能不是一个直接的子类,但是)如何在不使用反射的情况下检查.NET程序集

眼下的问题是,如果我们手头有Derived.dllBase.dll丢失,如何以编程方式检查所有类型Derived?例如知道什么类型可供选择,它们的可访问性,继承关系等

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

特别是,这是可以使用Roslyn或一些好的库容易实现的东西吗?

+0

我想这是不可能的。 .NET程序集不直接实现基类的类型以支持多态性。 –

+2

您可能必须为此使用Mono.Cecil。 Roslyn是编译器,不是元数据阅读器(但它必须读取元数据才能编译)。你将无法解决所有的关系?如果有一个由基类实现的接口会怎么样?您没有该类型信息,因为程序集不可用。 –

+0

也许这个线程可能会帮助你:http://stackoverflow.com/questions/2646707/something-better-than-net-reflector –

回答

1

为了研究.NET程序集(类型,方法等),您需要从元数据中获取它。 Roslyn它不是你正在寻找的。

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

无论如何,你可以以多种方式做到这一点。我会写两个。

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

var allTypesDefinitaion = MduleDefinition.ReadModule(assemblyPath).Types;

  • 使用工具,如CFF Explorer调查相关的元数据表。 (TypeDef \ Ref)
  • 相关问题