【问题标题】:How to resolve .NET Dll Hell?如何解决 .NET Dll Hell?
【发布时间】:2013-02-06 22:11:29
【问题描述】:

如何解决?

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

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

【问题讨论】:

标签: c# .net dll


【解决方案1】:

我碰巧遇到了 Newtonsoft 和另一个第三方库的确切问题。 Newtonsoft v3.x 和 v4.x 的问题是更新的库现在带有一个公钥令牌。这使得程序集重定向解决方案无用;但对于大多数其他情况,它是一个完全有效的解决方案。

我最终自己重新实现了第三方库。如果您有权访问第三方库的源代码,则始终可以使用较新的 Newtonsoft DLL 重新构建库。如果任何方法签名发生更改,您可能需要进行细微更改。

【讨论】:

  • 遇到同样的问题,下载一个 LITTLE 应用程序(只有几 Kbs),需要一个我没有的框架版本。要安装它,您必须自己搜索它,这可能会导致沮丧(版本地狱)。这是一个小应用程序,但需要围绕它分配一些废话。安装框架后,它需要更新(看起来像无休止的更新)。这不是非常用户友好和疯狂的部署应用程序的方式。现在我明白了为什么 Windows 这么大,现在我知道为什么世界上有这么多大胆的无毛男人了。为您的产品使用 .NET 时要三思。
【解决方案2】:

微软文章“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>

【讨论】:

  • 您能否展示如何做到这一点,以便依赖于不同版本 NewtonSoftJson 的每个程序集都获得正确的版本?
  • @Oded:我不能。我现在没有时间去探索这个。也许这个周末。
【解决方案3】:

通常,您可以通过应用程序/网络配置中的配置来解决此问题。您可以使用探测元素指定私有路径并将两个版本放在不同的文件夹中:

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

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

【讨论】:

    【解决方案4】:

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

    由于公钥令牌已更改,我无法使用程序集重定向。显然,使用不同的密钥来编译 1 个引用的程序集。不得不采取更严厉的措施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多