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

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);
3个回答

4

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

在引用DLL时忽略构建号

AssemblyVersion和AssemblyFileVersion之间的区别

简而言之,只有在引入可能会强制依赖项采用新版本的潜在破坏性更改时,才应更改AssemblyVersion。

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

因此,在开发中,我将使用静态程序集版本,在稳定发布时增加它,并手动管理未来版本的增量。


1

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

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


1
文件引用不会看到Debug/Release/x86/x64编译。但是Juozas Kontvainis在https://dev59.com/aEfRa4cB1Zd3GeqP_sDe的回答可以很好地解决这个问题。 - Luca
@Luca 公平的说,尽管 OP 没有询问不同编译的问题,但这仍然是有用的信息。 - RobV

0
对我来说,这里与插件无关,因为编译器错误是关于基础库的,考虑到您实现了插件基础架构,插件必须完全解耦并进行延迟加载。因此,即使存在插件加载问题,也会在运行时而不是编译时遇到。
所以对我来说,原因是您的程序集版本。
谢谢。

是的,将版本修订号修正为68(而不是默认值*),插件已正确加载和运行,即使基础库重新编译也是如此。那么,在插件加载时如何忽略修订号?我只想用主要版本和次要版本标记二进制更改。 - Luca
只是让它保持0,有什么问题吗? - Tigran
版本修订标识源/二进制发布。修订更改需要重新编译每个插件(并进行部署)。 - Luca
好的,但是再次强调,将其保留为0并递增所需版本的那一部分。我的意思是,如果您不想更改最后一个数字,请不要更改它,没有人和任何技术都不会强迫您这样做。 - Tigran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接