0

我正在开发一种工具,可以将加载项加载到我们办公室使用的商业软件中。可以通过使用从软件 API 中的类继承的类创建 .NET 程序集来开发此软件的插件。

所以我的软件需要检查 DLL 以确定它们是否包含按名称从 API 插件类继承的类。但是,我不希望我的应用程序依赖于 API 本身。它不需要实例化或执行任何这些类,只需确定从 API 插件类继承的类的全名。

我可以使用以下方法加载 dll 程序集:

Assembly.LoadFrom(dllFileName)

然而,当我尝试在加载的程序集中调用 GetTypes() 时。我收到一个 ReflectionTypeLoadException,其中包含许多 LoaderExceptions,抱怨找不到 API 文件。

我也尝试过使用ReflectionOnlyLoadFrom(),但它抛出了同样的异常。

有没有其他方法可以获取这些信息?同样,我不需要执行任何代码,最终我希望我的工具可以在根本没有安装 API 或软件的计算机上工作。我只需要知道完整的类名。

4

2 回答 2

0

无法使用Reflection. 如果您只是对查找依赖项感兴趣,可以使用ObjectExplorer来查看DLL程序集中的类并查看它们的基类型。并查找不属于同一程序集的类型。

您可以在此处找到一些有用的信息:
Visual Studio 中的哪个程序可以让我查看 DLL 以查看其 API?

于 2013-04-17T04:29:05.287 回答
0

这不能使用框架的反射 API 来完成。反射需要访问程序集以加载类型元数据。您可以做的是使用 Mono.Cecil(可在 nuget 上获得)之类的东西来检查 MSIL。以下示例显示了程序集中具有基类和接口的类型:

using Mono.Cecil;
using Mono.Cecil.Cil;

var assembly = AssemblyDefinition.ReadAssembly("ClassLibrary.dll");
// skip the first type '<Module>' whatever that is.
var types = assembly.MainModule.Types.Skip(1);

foreach (var type in types)
{
    var interfaces = type.Interfaces.Select(i => i.FullName);
    if (interfaces.Any())
    {
         Console.WriteLine("{0} : {1}, {2}", type.FullName, type.BaseType.FullName, string.Join(", ", interfaces));
    }
    else
    {
         Console.WriteLine("{0} : {1}", type.FullName, type.BaseType.FullName);
    }
}

这不会导致程序集或其任何依赖项被加载。当您知道您感兴趣的类直接从外部 API 类继承时,这将很有用。如果有多个继承级别,那么您将不得不做比我上面显示的更多的工作。

于 2013-04-17T04:29:51.463 回答