我有一个引用第三方库的项目。图书馆的制造商定期发布新版本。我的最终目标是能够在运行时选择在执行期间必须使用哪个版本。在运行时交换强烈签名的程序集
现在,我试图在运行时加载一个程序集,其版本号比编译期间使用的版本号高。我编译我的项目,用新版本替换第三方库并尝试运行应用程序。这是我遇到问题。我得到一个错误说:
“找到的程序集清单定义不匹配的程序集引用”
我是不是supprised看到这个错误,因为大会强烈签名。我寻找方法绕过这一点,但迄今没有任何运气。
我认为绑定重定向可以帮助我,但它的缺点是你不能指定一系列“newversions”。任何组合都应该可以工作,使用较新版本的旧版本,反之亦然。
<bindingRedirect oldVersion="1.2.7.0" newVersion="1.2.8.0" />
http://msdn.microsoft.com/en-us/library/eftw1fys.aspx
我也看了看动态调用,但后来我失去的类型安全(我的代码广泛使用在届党集中定义的类型)。 - >删除参考很困难。
删除项目定义引用中的公钥也没有帮助。编译期间使用的任何其他程序集版本都会失败。
<Reference Include="<assemblyname>">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Dependencies\<manufacturer>\1.2.7.0\<assemblyname>.dll</HintPath>
</Reference>
注: 逻辑来加载和卸载在运行时已经存在的组件。 没有可用于第三方库的接口
Brr,这是要求DLL地狱作为一项功能。它与强命名没有任何关系,因为[AssemblyVersion]中的不匹配而引发异常。 bindingRedirect确实是唯一很好的解决方案。除非您能说服供应商只增加兼容程序集的[AssemblyFileVersion],否则您会被卡住。否则增加[AssemblyVersion]意味着“不兼容,甚至不尝试”。 – 2012-01-02 15:52:26
@HansPassant AssemblyVersion确实是递增的,导致清单不匹配。说明明显不匹配只能出现在强签名的程序集中才正确吗?还是这个问题也适用于未签名的程序集? [程序集版本控制](http://msdn.microsoft.com/zh-cn/library/51ket42z.aspx) – Nickolas 2012-01-02 19:15:44
不,只有[AssemblyVersion]在这里很重要。它将以完全相同的方式在未签名的程序集上失败。 – 2012-01-02 19:20:32