2008-10-21 63 views
32

如果A引用程序集B 1.1和C,C引用B 1.2,那麼如何避免程序集衝突?引用同一程序集的不同版本

我nievely假設C'S的引用將被封裝的路程,不會引起任何問題,但它似乎所有的dll的被複制到bin,這是發生問題。

我明白這兩個方法是使用GAC或程序集綁定? GAC對我來說似乎不是最好的方法,因爲我不喜歡假設dll會在那裏,我更喜歡從解決方案中的lib目錄引用dll。

凡爲組件綁定似乎並不強大的對我來說,如果本裝置的一個版本具有的功能,其他沒有,這會不會產生問題?


在我的情況下,它是因爲我使用的是第三方DLL使用的NHibernate一箇舊版本,比我自己使用。

+0

我認爲你必須在標題中有一個錯字。 「相同的不同」應該可能是「不同的」。 :) – Herms 2008-10-21 19:42:21

回答

9

我已經在過去使用GAC獲得相同的結果,但你應該問你的原因有引用多個版本,並嘗試儘可能地避免它。如果你必須這樣做,binding redirect可能會幫助你的情況。

另外,你看過this了嗎?

1

您可以將bindingRedirect element添加到您的配置文件來指定要在運行時使用該程序集的版本。

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="myAssembly" 
           publicKeyToken="32ab4ba45e0a69a1" 
           culture="neutral" /> 
      <bindingRedirect oldVersion="1.0.0.0" 
          newVersion="2.0.0.0"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 
+2

是的,我提到在我的問題中,我問在裝配中有不同功能的情況下會發生什麼? – Dan 2008-10-22 08:06:35

1

.NET運行時完全能夠同時加載同一程序集的多個版本。但是,如果打算打開這種蠕蟲的話,我強烈建議你大膽地命名你的程序集並使用Major.Minor。*命名方案來避免命名衝突。

我不認爲你應該考慮一個尺寸適合所有人的方法來使用(或不)的GAC。如果您想自動使用隨未來版本的DLL發佈的新功能,GAC可以非常好。當然,這種祝福需要付出代價,新版本可能無法完全按照你期望的那樣工作:)。這些都是最實際的問題,以及您對發佈到GAC的內容擁有多少控制權。

問候, -Alan。

7

這樣做似乎很少有人知道的方法是使用extern關鍵字。

C# Reference

要引用兩個組件具有相同的完全限定的類型名稱, 別名必須在命令提示來指定,如下所示:

/R:GridV1 =網格。 dll的

/r:GridV2=grid20.dll

這將創建外部別名GridV1和GridV2。要在程序中使用這些 別名,請使用extern 關鍵字引用它們。例如:

extern alias GridV1;

extern alias GridV2;

每個外部別名聲明引入了與全局名稱空間並行(但不在其中)的額外根級別 名稱空間。因此,通過使用它們的完全限定名稱,根據 適當的名稱空間別名,可以在沒有 歧義的情況下引用每個程序集中的類型。

在前面的例子中,GridV1 :: Grid將是來自 grid.dll的網格控件,並且GridV2 :: Grid將是來自grid20.dll的網格控件。

+2

那麼,你幾乎如何使用它?這是什麼命令提示符,以及如何將它集成到構建過程中? – Nyerguds 2013-03-21 07:57:59

2

我需要支持組件的多個版本,並發現此解決方案:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="MyAssembly" publicKeyToken="..." /> 
     <codeBase version="1.1.0.0" href="MyAssembly_v1.1.0.0.dll"/> 
     <codeBase version="2.0.0.0" href="MyAssembly_v2.0.0.0.dll"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
相關問題