.net - 警告:在相同的相關程序集的不同版本之間發現衝突


我目前正在開發一個由20個項目組成的.NET應用程序。 其中一些項目使用.NET 3.5進行編譯,其他一些項目仍然是.NET 2.0項目(目前為止沒有問題)。

問題是,如果我包含一個外部組件,我總是得到以下警告:

"Found conflicts between different versions of the same dependent assembly".

這個警告究竟意味著什麼,有可能排除這個警告(就像在源代碼文件中使用#pragma disable一樣)?



Answers


此警告意味著兩個項目引用相同的程序集(例如System.Windows.Forms ),但是這兩個項目需要不同的版本。 你有幾個選擇:

  1. 重新編譯所有項目使用相同的版本(例如全部移到.net 3.5)。 這是首選選項,因為所有的代碼都與它們編譯的依賴關係版本一起運行。

  2. 添加綁定重定向 。 這將抑制警告。 但是,.net 2.0項目將(在運行時)綁定到.Net 3.5版本的相關程序集(如System.Windows.Forms 。 您可以通過在Visual Studio中雙擊錯誤來快速添加綁定重定向。

  3. 使用CopyLocal=true 。 我不確定這是否會壓制警告。 就像上面的選項2一樣,意味著所有的項目都將使用System.Windows.Forms的.Net 3.5版本。

這是一個實用工具,以確定違規參考(S):

https://gist.github.com/1553265




基本上,當你引用的程序集的“Copy Local”被設置為“True”時,就會發生這種情況,這意味著DLL的副本和你的exe文件一起放在bin文件夾中。

由於Visual Studio也會復制引用程序集的所有依賴關係,所以可能會引用相同程序集的兩個不同的構建。 如果您的項目在單獨的解決方案中,則更有可能發生這種情況,因此可以單獨編譯。

我已經得到的方式是將復製本地設置為假裝配項目中的引用。 只適用於需要運行成品的程序集的可執行程序/ Web應用程序。

希望是有道理的!




我想發表他們在上面評論中提供的保羅亞的解決方案。 我相信這是找到違規引用的最佳解決方案。

找到什麼是“違規引用”最簡單的方法是設置生成輸出詳細程度(工具,選項,項目和解決方案,生成和運行,MSBuild項目生成輸出詳細,詳細),並建立後,搜索輸出窗口為警告。 看到它上面的文字。

例如,當您在輸出面板上搜索“衝突”時,可能會發現如下所示:

3>  There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3>      "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.

如您所見,EF版本5和6之間存在衝突。




我和我的一個項目有同樣的問題,但是,以上都沒有幫助解決這個警告。 我檢查了詳細的構建日誌文件,我使用AsmSpy來驗證我在受影響的解決方案中使用了每個項目的正確版本,我再次檢查每個項目文件中的實際條目 - 沒有任何幫助。

最後事實證明,這個問題是我在一個項目中引用的一個嵌套依賴項。 這個參考文獻(A)又需要一個不同版本的(B),它直接從我的解決方案中的所有其他項目中引用。 更新引用項目中的引用解決了它。

Solution A
+--Project A
   +--Reference A (version 1.1.0.0)
   +--Reference B
+--Project B
   +--Reference A (version 1.1.0.0)
   +--Reference B
   +--Reference C
+--Project C
   +--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)

Solution B
+--Project A
   +--Reference A (version 1.1.1.0)

我希望上面顯示的是我的意思,花了我幾個小時的時間來發現,所以希望別人也會受益。




我只是有這個警告信息,並清理解決方案,並重新編譯(建設 - >清潔解決方案),它走了。




我有同樣的問題,我通過在web.config中更改以下解決方案。

它發生在我身上,因為我正在運行使用Newtonsoft.Json 4.0的應用程序

從:

<dependentAssembly>
  <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>

至:

<dependentAssembly>
  <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>



在Visual Studio上,如果你右鍵點擊解決方案並且管理nuget包,那麼將會把所有包設置為相同版本的“合併”選項卡。




這實際上取決於你的外部組件。 當您在.NET應用程序中引用外部組件時,它會生成一個GUID來標識該組件。 當您的某個項目引用的外部組件與另一個組件中的另一個此類組件具有相同的名稱,但具有不同的版本時,會發生此錯誤。

當您使用“瀏覽”查找引用並添加錯誤版本的程序集,或者您的代碼庫中的組件版本與您在本地計算機上安裝的版本不同時,有時會發生這種情況。

請嘗試找到哪些項目有這些衝突,從參考列表中刪除組件,然後再次添加它們,確保您指向相同的文件。




如果你使用Nuget來管理你的依賴關係,我有另一種方法來做到這一點。 我發現有時VS和Nuget不匹配,Nuget無法識別你的項目不同步。 packages.config會說一件事,但是參考文獻 - 屬性中顯示的路徑會指出其他的東西。

如果您願意更新您的依賴關係,請執行以下操作:

  1. 從解決方案資源管理器,右鍵單擊項目,然後單擊“管理Nuget包”

  2. 選擇左側窗格中的“Installed packages”選項卡記錄已安裝的軟件包如果您有很多軟件,則可能需要先將packages.config複製到桌面,以便與Google進行交叉檢查,以查看安裝了哪些Nuget pkgs

  3. 卸載你的軟件包。 好的,我們馬上把它們加進去。

  4. 立即安裝你需要的軟件包。 Nuget將會做的不僅是讓你獲得最新版本,而且會改變你的引用,並為你添加綁定重定向。

  5. 為所有的項目做這個。

  6. 在解決方案級別,執行“清理和重建”。

您可能希望從較低的項目開始,到更高層次的項目,並隨時重建每個項目。

如果您不想更新依賴關係,那麼可以使用包管理器控制台,並使用Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]




也有這個問題 - 在我的情況下,它是由一些引用設置為true的“特定版本”屬性造成的。 在這些引用上將其更改為false可以解決問題。




=>檢查是否會有部分應用程序安裝實例。

=>首先從卸載應用程序中卸載該實例。

=>然後,清理,重建,並嘗試部署。

這解決了我的問題,它也可以幫助你。 最好的祝福。




這也發生在我身上。 一個DLL被引用兩次:一次直接(在引用中)和一次間接(由另一個引用的項目引用)。 我刪除了直接引用,清理和重建解決方案。 問題修復了。




  1. 打開“解決方案瀏覽器”。
  2. 點擊“顯示所有文件”
  3. 展開“參考”
  4. 您會看到一個(或多個)參考圖標,其圖標略有不同。 通常情況下,黃色的方塊表示你要記下它。 只要刪除它。
  5. 添加參考返回並編譯您的代碼。
  6. 就這樣。

在我的情況下,MySQL參考有一個問題。 不知何故,我可以列出所有可用參考列表下的三個版本; 為.net 2.0,.net 4.0和.net 4.5。 我遵循上面的過程1到6,它為我工作。




另一件要考慮和檢查的事情是,確保你沒有任何運行的服務在使用該bin文件夾。 如果他們正在停止服務和重建解決方案