我在.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);发布于 2011-08-23 09:56:15
阅读这些问题和答案,以便更深入地讨论AssemblyVersion与AssemblyFileVersion的使用。
Ignoring build numbers when referencing DLLs
Differences between AssemblyVersion and AssemblyFileVersion
简短的版本是,只有在对程序集引入可能会破坏的更改(强制受抚养人采用新版本)时,才应该更改AssemblyVersion。
对于微小的更改,您可以使用AssemblyFileVersion标记差异。
因此,我将使用静态程序集版本进行开发,当您获得希望继续管理的稳定版本时,增加它,并手动管理未来的版本增量。
发布于 2011-08-23 09:53:14
假设您正在使用Visual,请查看其中一个项目中的引用,该项目是一个插件。当您查看对基库的引用的属性时,SpecificVersion标志设置为什么?尝试将其设置为False,看看这是否有区别。
注意,如果您的项目使用的是项目引用,而不是直接引用已编译的DLL,则不会出现此标志。在这种情况下,您需要像您已经尝试过的那样在基本库中使用固定的修订号,或者您应该转而使用对DLL的直接引用,这样就可以更改SpecificVersion属性。
发布于 2011-08-23 09:18:38
在我看来,这里与插件无关,因为编译器错误讨论了基本库,并且考虑到您实现了插件基础架构,插件必须被完全解码和加载。因此,即使存在插件加载问题,您也会在运行时遇到而不是编译时。
所以对我来说,原因是你的组装版。
致以问候。
https://stackoverflow.com/questions/7158606
复制相似问题