C#插件系统二进制兼容性问题

时间:2011-08-23 09:07:49

标签: c# plugins binary-compatibility

我在.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);

3 个答案:

答案 0 :(得分:4)

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

Ignoring build numbers when referencing DLLs

Differences between AssemblyVersion and AssemblyFileVersion

简短版本是,只有当您在该程序集上引入可能会导致依赖项采用新版本的重大更改时,才应更改AssemblyVersion。

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

因此,我将使用静态汇编版本进行开发,当您获得要继续管理的稳定版本并手动管理未来版本增量时,将其递增。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

所以对我而言,原因是你的装配版本。

问候。