我正在尝试使用类似于以下代码的程序集来扫描实现特定接口的类型的类型:
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;
}
我的问题是,在某些情况下ReflectionTypeLoadException
调用时会asm.GetTypes()
出现,例如,如果程序集包含引用当前不可用的程序集的类型。
就我而言,我对引起问题的类型不感兴趣。我要搜索的类型不需要不可用的程序集。
问题是:是否可以以某种方式跳过/忽略导致异常的类型,但仍处理程序集中包含的其他类型?
1
它可能比您正在寻找的东西要重写的多得多,但是MEF为您提供了类似的功能。只需用一个[Export]标记标记您的每个类,该标记指定它实现的接口。然后,您只能导入您当时感兴趣的那些接口。
—
Dirk Dastardly,
@Drew,感谢您的评论。我当时正在考虑使用MEF,但想看看是否还有另一个更便宜的解决方案。
—
M4N
为插件类工厂提供一个众所周知的名称,以便您可以直接使用Activator.CreateInstance()是一个简单的解决方法。但是,如果由于程序集解析问题而现在得到此异常,那么您稍后可能也会得到它。
—
汉斯·帕桑
@汉斯:我不确定我是否完全理解。我正在扫描的程序集可能包含实现给定接口的许多类型,因此没有一种众所周知的类型。(并且:我正在扫描多个组件,而不仅仅是一个组件)
—
M4N
我几乎有相同的代码,也有相同的问题。我探索的程序集由给出
—
v.oddou
AppDomain.CurrentDomain.GetAssemblies()
,这适用于我的机器,但不适用于其他机器。为什么到底为什么我的可执行文件中的某些程序集还是无法读取/加载?