我正在尝试使用类似于此的代码扫描程序集以查找实现特定接口的类型:
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;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在某些情况下,我得到一个ReflectionTypeLoadException调用asm.GetTypes(),例如,如果程序集包含引用当前不可用的程序集的类型.
就我而言,我对导致问题的类型不感兴趣.我正在搜索的类型不需要不可用的程序集.
问题是:是否有可能以某种方式跳过/忽略导致异常但仍处理程序集中包含的其他类型的类型?
我们为我们的应用程序实现了一个插件框架,并使用Assembly.Loadfrom加载插件程序集.然后我们使用GetTypes()并进一步检查每个插件文件的类型以获得支持的接口.
用户提供了插件的路径,我们循环浏览文件夹中的每个文件,看看它(插件)是否支持我们的插件界面.如果是,我们创建一个实例,如果不是,我们移动到下一个文件.
我们从一个代码库(appA_1和appA_2)构建两个版本的软件.
当插件由与插件文件同时构建的应用程序加载时,加载插件很有效.但是,如果我们构建appA_2并指向appA_1的插件文件夹,则在调用GetTypes()时会出现异常.
我们代码的基本版本是;
var pluginAssembly = Assembly.LoadFrom(FileName);
foreach (var pluginType in pluginAssembly.GetTypes())
{
Run Code Online (Sandbox Code Playgroud)
我们得到一个"ReflectionTypeLoadException"异常.
这是令人担忧的,因为我们希望我们的应用程序能够加载由任何人构建的任何插件的类型.我们缺少什么?
编辑:在遍历LoaderExceptions之后,我们发现有一个文件libPublic.dll会生成System.IO.FileNotFoundException异常.奇怪的是,该文件驻留在应用程序目录中,插件被引用到项目文件中.
编辑2:在异常日志中,我们发现以下"比较程序集名称导致不匹配:修订号"