【发布时间】:2011-12-14 21:51:11
【问题描述】:
我正在尝试使用类似于此的代码扫描程序集以查找实现特定接口的类型:
public List<Type> FindTypesImplementing<T>(string assemblyPath)
{
var matchingTypes = new List<Type>();
var asm = Assembly.LoadFrom(assemblyPath);
foreach (var t in asm.GetTypes())
{
if (typeof(T).IsAssignableFrom(t))
matchingTypes.Add(t);
}
return matchingTypes;
}
我的问题是,在某些情况下,我在调用 asm.GetTypes() 时会收到 ReflectionTypeLoadException,例如如果程序集包含引用当前不可用的程序集的类型。
就我而言,我对导致问题的类型不感兴趣。我正在搜索的类型不需要不可用的程序集。
问题是:是否有可能以某种方式跳过/忽略导致异常但仍处理程序集中包含的其他类型的类型?
【问题讨论】:
-
它可能比您正在寻找的内容更多的是重写,但 MEF 为您提供了类似的功能。只需使用 [Export] 标记来标记您的每个类,该标记指定它实现的接口。然后你可以只导入你当时感兴趣的那些接口。
-
@Drew,感谢您的评论。我正在考虑使用 MEF,但想看看是否有其他更便宜的解决方案。
-
给插件类工厂起一个众所周知的名字,这样你就可以直接使用 Activator.CreateInstance() 是一个简单的解决方法。不过,如果您现在由于程序集解析问题而遇到此异常,那么您以后可能也会遇到。
-
@Hans:我不确定我是否完全理解。我正在扫描的程序集可能包含实现给定接口的任意数量的类型,因此没有一种众所周知的类型。 (还有:我正在扫描多个程序集,而不仅仅是一个)
-
我有几乎相同的代码,同样的问题。我探索的程序集由
AppDomain.CurrentDomain.GetAssemblies()给出,这适用于我的机器,但不适用于其他机器。为什么我的可执行文件中的某些程序集无论如何都无法读取/加载??
标签: .net reflection plugins .net-assembly