【发布时间】:2011-02-09 03:20:10
【问题描述】:
我们为我们的应用程序实现了一个插件框架,并使用 Assembly.Loadfrom 加载插件程序集。然后我们使用 GetTypes() 并进一步检查每个插件文件的类型以获取支持的接口。
插件的路径由用户提供,我们循环浏览文件夹中的每个文件以查看它(插件)是否支持我们的插件接口。如果是,我们创建一个实例,如果不是,我们移动到下一个文件。
我们从一个代码库(appA_1 和 appA_2)构建两个版本的软件。
当插件由与插件文件同时构建的应用程序加载时,加载插件效果很好。但是,如果我们构建 appA_2 并指向 appA_1 的插件文件夹,则在调用 GetTypes() 时会出现异常。
我们的代码的基本版本是;
var pluginAssembly = Assembly.LoadFrom(FileName);
foreach (var pluginType in pluginAssembly.GetTypes())
{
我们得到一个“ReflectionTypeLoadException”异常。
这是令人担忧的,因为我们希望我们的应用程序能够加载由任何人构建的任何插件的类型。我们缺少什么吗?
编辑: 在遍历 LoaderExceptions 之后,我们发现有一个文件 libPublic.dll 会生成 System.IO.FileNotFoundException 异常。奇怪的是,这个文件驻留在应用程序目录中,而插件被引用到项目文件中。
编辑 2: 在异常日志中,我们发现以下内容 “比较程序集名称导致不匹配:修订号”
【问题讨论】:
-
异常信息是什么?异常是否有内部异常?那是什么信息?
-
您不使用现有框架(如 MEF)的任何原因?
-
在使用 MEF 时仍然会产生类似的问题,尽管 MEF 绝对可以方便地处理繁琐的工作。
-
谢谢你。你的智慧令人印象深刻!
-
您使用的是强名称程序集吗?默认情况下,绑定到这些是特定于版本的。
标签: c# reflection plugins assemblies