.NET:强签名程序集的加载问题 之 版本重定向
背景
多数解决方案会包含多个项目,某些支持插件架构的解决方案中,更是包含多个插件项目,这些项目会使用一些第三方NuGet Packages,如果管理不慎,解决方案中会出现多个版本的引用,这在编译期间不会引起问题,甚至开发调试期间也不会有问题,不过在发布过程会出现一些诡异的问题,如:未能加载xxx.dll等问题。本文简单的介绍一下解决思路。
继续看之前可以先看看这篇文章:http://www.cnblogs.com/happyframework/p/3399975.html。
版本重定向
强签名程序集的标识包含了版本号,.NET 在执行程序集探测之前,会先根据版本重定向配置解析出需要加载的版本号。
1 <configuration> 2 <runtime> 3 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 4 <dependentAssembly> 5 <assemblyIdentity name="myAssembly" 6 publicKeyToken="32ab4ba45e0a69a1" 7 culture="neutral" /> 8 <bindingRedirect oldVersion="1.0.0.0" 9 newVersion="2.0.0.0"/> 10 <codeBase version="2.0.0.0" 11 href="http://www.litwareinc.com/myAssembly.dll"/> 12 </dependentAssembly> 13 </assemblyBinding> 14 </runtime> 15 </configuration>
解析出版本号以后,剩下的就是经典的程序集探测过程了。需要说明的是:即使最终加载出重定向后的版本的程序集,程序也不见得能正常运行,因为:重定向后的程序集必须和编译时使用的程序集二进制兼容,所谓二进制兼容也容易理解,就是编译时使用的成员签名不能发生变化。