首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DLL中查找从不可用程序集中的类继承的类

在DLL中查找从不可用程序集中的类继承的类
EN

Stack Overflow用户
提问于 2013-04-17 11:22:59
回答 2查看 1.4K关注 0票数 0

我正在开发一个工具,可以将插件加载到我们办公室使用的一个商业软件中。可以通过创建一个.NET程序集来开发此软件的外接程序,该程序集包含从软件应用编程接口中的类继承的类。

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

我可以使用以下命令加载dll程序集:

代码语言:javascript
复制
Assembly.LoadFrom(dllFileName)

然而,当我试图在加载的程序集上调用GetTypes()时。我得到一个带有多个LoaderExceptions的ReflectionTypeLoadException,它抱怨找不到API文件。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-17 12:29:51

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

代码语言:javascript
复制
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类继承时,这将非常有用。如果有多个级别的继承,那么您将不得不做比我上面所展示的更多的工作。

票数 0
EN

Stack Overflow用户

发布于 2013-04-17 12:29:05

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

你可以在这里找到一些有用的信息:

Which program in Visual Studio lets me look into DLLs to see its API?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16050888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档