怎么修?
我有 2 个使用 NewtonSoftJson.dll 的第 3 方程序集。问题是其中一个使用较旧的 3.xx,另一个使用 4.5.x。因此,在运行时,至少 2 个程序集中的 1 个会抱怨另一个程序集。
我该如何解决这个问题?我可以设置服务,但代码和环境目前没有这样设置。在给定的时间内,重构也太多了,无法安全地完成。
我碰巧遇到了 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 个引用的程序集。不得不采取更严厉的措施。