如何解决.NET Dll地狱

本文关键字:NET Dll 地狱 解决 何解决 | 更新日期: 2023-09-27 17:57:57

如何修复?

我有两个使用NewtonSoftJson.dll的第三方程序集。问题是其中一个使用旧的3.x.x,另一个使用4.5.x。因此,在运行时,两个程序集中至少有一个会抱怨另一个。

我该如何解决此问题?我可以设置服务,但代码和环境目前不是这样设置的。它也有太多的重构,无法在给定的时间内安全地完成。

如何解决.NET Dll地狱

我碰巧在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个。不得不采取更严厉的措施。