如何解决.NET Dll地狱?

时间:2013-02-06 22:11:29

标签: c# .net dll

如何解决?

我有2个第三方程序集,它们使用NewtonSoftJson.dll。 catch是其中一个使用较旧的3.x.x而另一个使用4.5.x.所以在运行时,两个组件中至少有一个抱怨另一个。

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

3 个答案:

答案 0 :(得分:3)

微软文章“Redirecting Assembly Versions”有这样的说法:

  

以下示例显示如何重定向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>

答案 1 :(得分:2)

通常,您可以通过app / web配置中的配置解决此问题。您可以使用探测元素指定专用路径,并将两个版本放在不同的文件夹中:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

另一种方法是使用程序集绑定重定向。但这只有在您知道版本兼容的情况下才有效。由于您没有直接使用它们,我不确定您是否知道这一点,并且发布者通过更改程序集版本表明存在一些不兼容性。

答案 2 :(得分:1)

使用反编译器结束,将项目添加到解决方案,引用新dll,修复错误并重新编译,指向最近添加的项目。

由于公钥标记已更改,因此无法使用程序集重定向。显然,使用不同的密钥来编译其中一个引用的程序集。不得不采取更激烈的措施。