我正试图编写一个应用程序,它加载一个程序集并列出这再次依赖于哪些程序集。使用Assembly.LoadFrom(asmPath)和GetReferencedAssemblies(),这部分工作得很好。
我还想从dll中提取一些公共信息。主要是我想找到实现某些标签的类(通常是microsoft . aspnetcore . mvc . apicontrollererattribute)和这些函数的参数。当我尝试调用asm.GetTypes()时,我得到一个reflectiontypeloadeexception,因为Microsoft.AspNetCore.Mvc.Core没有加载。
是否有一种方法来加载Microsoft.AspNetCore.Mvc.Core使用引用的程序集?我正试图为许多dll这样做,因此在我的"汇编检查程序"中添加了一个nuget参考。因为所有的参考文献都是不可能的。或者有更好的方法来获得我正在寻找的信息?
下面是我用来查找实现某些泛型接口的类型的代码片段:
public static IEnumerable<ImplementedInterface> FindTypesImplementingGenericInterface(this Assembly assembly, Type genericInterfaceType)
{
var types = from type in assembly.GetTypes()
from iface in type.GetInterfaces()
where iface.IsGenericInterface(genericInterfaceType)
select new ImplementedInterface { Implementation = type, Interface = iface };
return types;
}
public static bool IsGenericInterface(this Type type, Type genericInterfaceType)
{
return type.IsGenericType && type.GetGenericTypeDefinition() == genericInterfaceType;
}
也是另一个片段,但用于从一个程序集查找实现另一个程序集接口的类:
public static IEnumerable<dynamic> FindTypesImplementingInterface(Type impl_interface)
{
var interfaceAssembly = typeof(Contract.IEventWithTopic).Assembly;
var implementationAssembly = typeof(Handlers.SmartTube.STAccountEventHandler).Assembly;
var result = from @interface in interfaceAssembly.GetTypes()
from implementation in implementationAssembly.GetTypes()
where @interface.GetInterfaces().Any(i => i.Equals(impl_interface)) &&
implementation.GetInterfaces().Any(i => i.Equals(@interface))
select new { Interface = @interface, Implementation = implementation };
return result;
}
返回类型是动态的,因为没有类来存储数据。您可以创建一个单独的类来存储这些结果,或者使用元组。
你可以试着用attribute替换interface,这个方法应该可以正常工作。
和这些函数的实参
GetMethods()获取当前类型拥有的所有函数。GetParameters()获取当前方法(MethodInfo)拥有的所有参数信息。