我正在开发一种工具,可以将加载项加载到我们办公室中使用的商业软件中。可以通过创建一个.NET程序集来开发该软件的加载项,该程序集包含继承自软件API中的类的类。
因此,我的软件需要检查DLL以确定它们是否包含按名称从API加载项类继承的类。但是,我不希望我的应用程序依赖于API本身。它不需要实例化或执行任何这些类,只需确定从API加载项类继承的类的全名。
我可以使用以下方法加载dll程序集:
Assembly.LoadFrom(dllFileName)
然而,当我尝试在加载的程序集上调用GetTypes()时。我收到一个ReflectionTypeLoadException,其中有许多LoaderExceptions抱怨无法找到API文件。
我也尝试使用ReflectionOnlyLoadFrom()
,但它抛出了相同的异常。
还有其他方法可以获取此信息吗?同样,我不需要执行任何代码,最终我希望我的工具能够在没有安装API或软件的计算机上运行。我需要知道的是完整的班级名称。
答案 0 :(得分:0)
使用Reflection
是不可能的。如果您只是想查找依赖项,可以使用ObjectExplorer
查看DLL
程序集中的类,并查看它们的基类型。并查找不属于同一程序集的类型。
您可以在此处找到一些有用的信息:
Which program in Visual Studio lets me look into DLLs to see its API?
答案 1 :(得分:0)
使用框架的Reflection API无法做到这一点。 Reflection需要访问程序集才能加载类型元数据。你可以做的是使用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类继承时,这将非常有用。如果有多个级别的继承,那么你将需要完成比我上面所示更多的工作。