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



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

阅读这些问题和答案,以获得关于使用AssemblyVersion与AssemblyFileVersion的更彻底的讨论。

引用dll时忽略构建号

AssemblyVersion和AssemblyFileVersion的差异

简短的版本是,当您在该程序集上引入潜在的破坏性更改时,您应该仅更改AssemblyVersion,该更改将迫使依赖项采用新版本。

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

所以我会使用一个静态的汇编版本进行开发,当你到达一个你想要管理的稳定版本时增加它,并手动管理未来的版本增量。

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

请注意,如果您的项目使用项目引用而不是直接引用编译后的DLL,则不会出现此标志。在这种情况下,你要么需要使用一个固定的版本号在基础库上,就像你已经尝试过的,或者你应该切换到使用直接引用的DLL,而不是这样你可以改变SpecificVersion属性。

对我来说,这与插件无关,因为编译器错误谈论的是基础库,考虑到你实现了插件基础架构,插件必须完全解码和加载。所以即使有插件加载问题,你也会在运行时遇到,而不是编译时。

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

问候。

最新更新