簡體   English   中英

如何解決.NET Dll地獄?

[英]How to resolve .NET Dll Hell?

怎么修?

我有2個第三方程序集,它們使用NewtonSoftJson.dll。 捕獲的是其中一個使用較舊的3.xx而另一個使用4.5.x. 所以在運行時,兩個組件中至少有一個抱怨另一個。

我該如何解決這個問題? 我可以設置服務,但代碼和環境目前沒有這樣設置。 在給定的時間內,它也可以安全地完成重構。

我碰巧遇到了牛頓軟件和另一個第三方庫的確切問題。 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,修復錯誤並重新編譯,指向最近添加的項目。

由於公鑰標記已更改,因此無法使用程序集重定向。 顯然,使用不同的密鑰來編譯其中一個引用的程序集。 不得不訴諸更激烈的措施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM