如何解决.NET Dll地狱
本文关键字:NET Dll 地狱 解决 何解决 | 更新日期: 2023-09-27 17:57:57
如何修复?
我有两个使用NewtonSoftJson.dll的第三方程序集。问题是其中一个使用旧的3.x.x,另一个使用4.5.x。因此,在运行时,两个程序集中至少有一个会抱怨另一个。
我该如何解决此问题?我可以设置服务,但代码和环境目前不是这样设置的。它也有太多的重构,无法在给定的时间内安全地完成。
我碰巧在Newtonsoft和另一个第三方库中遇到了确切的问题。Newtonsoft v3.x和v4.x的问题在于,较新的库现在带有公钥令牌。这使得程序集重定向解决方案变得毫无用处;但对于大多数其他情况来说,这是一个完全有效的解决方案。
我最终自己重新实现了第三方图书馆。如果您可以访问第三方库的源代码,则可以始终使用较新的Newtonsoft DLL重建库。如果任何方法签名发生了更改,则可能需要进行一些小的更改。
微软的文章"重定向程序集版本"是这样说的:
以下示例显示如何重定向myAssembly的一个版本到另一个,并关闭mySecondAssembly的发布者策略。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Assembly versions can be redirected in application,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="mySecondAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Publisher policy can be set only in the application
configuration file. -->
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
通常,您可以通过app/web配置中的配置来解决此问题。您可以使用探测元素来指定专用路径,并将两个版本放在不同的文件夹中:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2'subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
另一种方法是使用程序集绑定重定向。但只有当您知道这些版本是兼容的时,这才会起作用。由于您没有直接使用它们,我不确定您是否知道,并且发布者通过更改程序集版本表明了一些不兼容。
最终使用了反编译器,将项目添加到解决方案中,引用新的dll,修复错误并重新编译,指向最近添加的项目。
由于公钥令牌已更改,我无法使用程序集重定向。显然,使用了不同的密钥来编译引用的程序集中的1个。不得不采取更严厉的措施。