3

我在.NET 中实现了一个插件系统。基础库实现暴露给插件的基本类和接口,插件库链接基础库以使用暴露的类和接口。

我面临的问题是基础库的(简单)重新编译(有或没有修改)导致插件无法加载,并给出异常消息:

 "Could not load file or assembly 'BaseLibrary, Version=0.0.1.68, Culture=neutral, PublicKeyToken=7b445b12e635292c' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)"

这个问题是通过同时编译基础库和插件库来解决的,但是在开发过程中这不是很舒服,因为我在这个阶段经常修改基础库。

如果有什么方法可以“放松”二进制匹配?

基础库程序集信息(引用如下)是否可能是问题的原因?

 [assembly: AssemblyVersion("0.0.1.*")]

我忘了提到程序集是签名的。


使用以下例程加载程序集

Assembly hLibrary = Assembly.LoadFile(pPath);
Type plugImageCodecFactoryType = hLibrary.GetType("Derm.ImageCodecPluginFactory", true, false);
object plugImageCodecFactory = Activator.CreateInstance(plugImageCodecFactoryType);
object plugInstance;

MethodInfo plugFactoryCreate = plugImageCodecFactoryType.GetMethod("CreatePlugin", BindingFlags.Instance|BindingFlags.Public);

plugInstance = plugFactoryCreate.Invoke(plugImageCodecFactory, null);

if (plugInstance is IImageCodecPlugin)
    RegisterPlugin((IImageCodecPlugin)plugInstance);
4

3 回答 3

4

阅读这些问题和答案,以更深入地讨论 AssemblyVersion 与 AssemblyFileVersion 的使用。

引用 DLL 时忽略内部版本号

AssemblyVersion 和 AssemblyFileVersion 之间的区别

简短的版本是,您应该只在您对该程序集引入潜在的重大更改时更改 AssemblyVersion,这将迫使依赖项采用新版本。

对于较小的更改,您可以使用 AssemblyFileVersion 来标记差异。

因此,我将使用静态程序集版本进行开发,当您获得想要管理的稳定版本时增加它并手动管理未来的版本增量。

于 2011-08-23T09:56:15.280 回答
1

假设您使用的是 Visual Studio,请查看其中一个插件项目中的引用。当您查看对基本库的引用的属性时,SpecificVersion标志设置为什么?尝试将其设置为False,看看是否有所作为。

请注意,如果您的项目使用项目引用而不是直接引用已编译的 DLL,则此标志将不存在。在这种情况下,您要么需要像尝试过的那样在基本库上使用固定的修订号,要么应该切换到使用对 DLL 的直接引用,以便更改SpecificVersion属性。

于 2011-08-23T09:53:14.350 回答
0

对我来说,这里与插件无关,因为编译器错误谈论基本库,并且考虑到您实现了插件基本架构,插件必须完全解耦并延迟加载。因此即使存在插件加载问题,您也会在运行时遇到而不是编译时。

所以对我来说,原因是你的汇编版本。

问候。

于 2011-08-23T09:18:38.340 回答