Cảnh báo: Đã tìm thấy xung đột giữa các phiên bản khác nhau của cùng một tổ hợp phụ thuộc


320

Tôi hiện đang phát triển một ứng dụng .NET, bao gồm 20 dự án. Một số dự án được biên dịch bằng .NET 3.5, một số dự án khác vẫn là dự án .NET 2.0 (cho đến nay không có vấn đề gì).

Vấn đề là nếu tôi bao gồm một thành phần bên ngoài, tôi luôn nhận được cảnh báo sau:

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

Chính xác thì cảnh báo này có ý nghĩa gì và có khả năng loại trừ cảnh báo này không (như sử dụng #pragma vô hiệu hóa trong các tệp mã nguồn)?


Câu trả lời:


410

Cảnh báo này có nghĩa là hai dự án tham chiếu cùng một tổ hợp (ví dụ System.Windows.Forms) nhưng hai dự án yêu cầu các phiên bản khác nhau. Bạn có một vài lựa chọn:

  1. Biên dịch lại tất cả các dự án để sử dụng các phiên bản giống nhau (ví dụ: chuyển tất cả sang .Net 3.5). Đây là tùy chọn ưa thích vì tất cả mã đang chạy với các phiên bản phụ thuộc mà chúng được biên dịch.

  2. Thêm một chuyển hướng ràng buộc . Điều này sẽ ngăn chặn cảnh báo. Tuy nhiên, các dự án .Net 2.0 của bạn sẽ (trong thời gian chạy) bị ràng buộc với các phiên bản .Net 3.5 của các hội đồng phụ thuộc như System.Windows.Forms. Bạn có thể nhanh chóng thêm một chuyển hướng ràng buộc bằng cách nhấp đúp vào lỗi trong Visual Studio.

  3. Sử dụng CopyLocal=true. Tôi không chắc chắn nếu điều này sẽ ngăn chặn cảnh báo. Nó sẽ, giống như tùy chọn 2 ở trên, có nghĩa là tất cả các dự án sẽ sử dụng phiên bản .Net 3.5 của System.Windows.Forms.

Dưới đây là một số cách để xác định (các) tham chiếu vi phạm:

  • Bạn có thể sử dụng một tiện ích như tiện ích được tìm thấy tại https://gist.github.com/1553265
  • Một phương pháp đơn giản khác là thiết lập mức độ chi tiết của đầu ra Xây dựng (Công cụ, Tùy chọn, Dự án và Giải pháp, Xây dựng và Chạy, Độ dài đầu ra của dự án xây dựng dự án MSBuild, Chi tiết) và sau khi xây dựng, tìm kiếm cửa sổ đầu ra để cảnh báo và xem văn bản ngay phía trên nó . (Hat tip cho pauloya người đề nghị này trong các ý kiến ​​về câu trả lời này) .

9
Chỉ với một cách nhanh chóng để tìm thấy nó mà không cần tiện ích - nếu bạn thêm chuyển hướng ràng buộc (như tùy chọn 2), nó sẽ hiển thị ở đó (các) tham chiếu liên quan - nếu muốn, bạn có thể sử dụng một trong các phương pháp khác để xử lý nó và xóa (các) chuyển hướng ràng buộc khỏi tệp cấu hình của bạn.
Brisbe

222
Cách đơn giản nhất để tìm "tham chiếu vi phạm" là gì để thiết lập mức độ chi tiết của đầu ra Xây dựng (Công cụ, Tùy chọn, Dự án và Giải pháp, Xây dựng và Chạy, Độ dài đầu ra của dự án xây dựng dự án MSBuild, Chi tiết) và sau khi xây dựng, tìm kiếm cửa sổ đầu ra để cảnh báo. Xem văn bản ngay phía trên nó.
pauloya

7
Chuyển hướng ràng buộc bằng cách nhấp đúp vào cảnh báo (bước 2) không xóa cảnh báo của tôi. Tôi thấy app.config được thêm vào với hội đồng mà tôi nghi ngờ là nguyên nhân, nhưng cảnh báo vẫn còn đó sau khi dọn dẹp / xây dựng lại. Cũng đã thử bước 3 ngoài ra, không có may mắn. Có ý kiến ​​gì không?
angensesen

9
Điều gì xảy ra nếu họ không tham khảo từ các dự án của riêng bạn? Ví dụ: tôi đã tham chiếu một dự án, có sự phụ thuộc vào Newtonsoft.Json, Version = 6.0.0.0 và tôi đã tham chiếu một dự án khác, có sự phụ thuộc vào Newtonsoft.Json, Version = 4.5.0.0
Edward Ned Harvey

3
@ brian-low, tôi có thể đề xuất thêm cài đặt độ dài đầu ra của Build (như được đề xuất trong nhận xét của @pauloya) như một tùy chọn trong câu trả lời của bạn cùng với tiện ích được liên kết không? (Từ chối trách nhiệm, tôi thực sự đã cố gắng chỉnh sửa câu trả lời để làm điều đó nhưng nó đã bị từ chối khi xem xét :))
Rick Riensche

44

Về cơ bản, điều này xảy ra khi các hội đồng mà bạn tham chiếu có "Sao chép cục bộ" được đặt thành "Đúng", nghĩa là một bản sao của DLL được đặt trong thư mục bin cùng với exe của bạn.

Vì Visual Studio cũng sẽ sao chép tất cả các phụ thuộc của một hội đồng được tham chiếu, nên có thể kết thúc bằng hai bản dựng khác nhau của cùng một cụm được đề cập. Điều này có nhiều khả năng xảy ra nếu các dự án của bạn nằm trong các giải pháp riêng biệt và do đó có thể được biên dịch riêng.

Cách tôi đã giải quyết là đặt Sao chép cục bộ thành Sai để tham khảo trong các dự án lắp ráp. Chỉ làm điều đó cho các ứng dụng thực thi / ứng dụng web nơi bạn cần lắp ráp cho sản phẩm hoàn chỉnh để chạy.

Hy vọng rằng có ý nghĩa!


31

Tôi muốn đăng giải pháp của pauloya mà họ đã cung cấp trong các ý kiến ​​trên. Tôi tin rằng đó là giải pháp tốt nhất để tìm các tài liệu tham khảo vi phạm.

Cách đơn giản nhất để tìm "tham chiếu vi phạm" là gì để thiết lập mức độ chi tiết của đầu ra Xây dựng (Công cụ, Tùy chọn, Dự án và Giải pháp, Xây dựng và Chạy, Độ chi tiết xây dựng dự án MSBuild, Chi tiết) và sau khi xây dựng, tìm kiếm cửa sổ đầu ra để cảnh báo. Xem văn bản ngay phía trên nó.

Ví dụ: khi bạn tìm kiếm bảng điều khiển đầu ra cho "xung đột", bạn có thể tìm thấy một cái gì đó như thế này:

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.

Như bạn có thể thấy, có một xung đột giữa các phiên bản EF 5 và 6.


3
Nhưng bây giờ tôi có thông tin này, làm cách nào để xóa lỗi? Tôi có thể thấy xung đột là gì, nhưng tôi không thể tìm thấy nơi dự án đang tham chiếu phiên bản xung đột
Bassie

Xin chào @Bassie, việc đầu tiên cần làm là kiểm tra tệp gói nuget của bạn và xác định xem bạn có cần cập nhật tất cả các tệp lên cùng một phiên bản của gói không. Bạn có thể làm điều này bằng cách chạy một lệnh tương tự update-package [your package name] -version 6.0.0 -reinstallnhư câu trả lời của tôi ở đây stackoverflow.com/questions/22685530/
Kẻ

@Bassie, bạn có thể làm những gì cảnh báo gợi ý và thêm chuyển hướng ràng buộc vào tệp app.config! (nếu cập nhật không phải là một tùy chọn, nghĩa là.)
BrainSlugs83

@Bassie xem câu trả lời của tôi, nơi tôi chỉ cho bạn thấy làm thế nào để có được các hội đồng / chương trình khác nhau gây ra sự cố không khớp.
in

22

Tôi đã có cùng một vấn đề với một trong những dự án của tôi, tuy nhiên, không có điều nào ở trên giúp giải quyết cảnh báo. Tôi đã kiểm tra logfile xây dựng chi tiết, tôi đã sử dụng AsmSpy để xác minh rằng tôi đã sử dụng các phiên bản chính xác cho từng dự án trong giải pháp bị ảnh hưởng, tôi đã kiểm tra lại các mục thực tế trong mỗi tệp dự án - không có gì giúp được.

Cuối cùng, hóa ra vấn đề là sự phụ thuộc lồng nhau của một trong những tài liệu tham khảo tôi có trong một dự án. Lần lượt tham chiếu này (A) yêu cầu một phiên bản (B) khác được tham chiếu trực tiếp từ tất cả các dự án khác trong giải pháp của tôi. Cập nhật các tham chiếu trong dự án tham chiếu đã giải quyết nó.

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)

Tôi hy vọng những điều trên cho thấy những gì tôi muốn nói, mất một vài giờ để tìm hiểu, vì vậy hy vọng người khác cũng sẽ có lợi.


1
Cùng một vấn đề ở đây. Tuy nhiên, tôi không có cơ hội cập nhật tham chiếu lên phiên bản mới hơn. Tôi đã thử sử dụng App.config: trong khi nó hoạt động cho ứng dụng, Visual Studio 2010 dường như bỏ qua nó trong quá trình xây dựng.
Thomas Weller

1
wow, tôi đã có những vấn đề này trong hai tháng và không thể xác định và giải quyết nó. Vì một số lý do, nó sẽ chỉ bị sập trong quá trình gỡ lỗi và trong một số trường hợp, nó sẽ thay thế thủ công một cách khó chịu bằng cái thật trong thư mục bin khi điều đó xảy ra. Gỡ lỗi là một nỗi đau thực sự. Khi tôi đọc câu trả lời của bạn, tôi nhận ra đây chính xác là những gì đang xảy ra với tôi và tôi đã sửa nó trong 5 phút :)
Dennis Puzak

19

Trên Visual Studio nếu bạn nhấp chuột phải vào giải phápQuản lý các gói nuget có tab "Hợp nhất" để đặt tất cả các gói thành cùng một phiên bản.


Cảm ơn vì tiền hỗ trợ. Lần này nó không giúp tôi, nhưng thật tốt khi biết điều đó.
BrainSlugs83

8

Tôi vừa có thông báo cảnh báo này và làm sạch giải pháp và biên dịch lại (Build -> Clean Solution) và nó biến mất.


9
Chỉ cho đến khi bạn xây dựng lại giải pháp mặc dù
Luke

Điều này cứu tôi! Tôi đã thử giải pháp khác từ hôm qua nhưng giải pháp này đã giải quyết được vấn đề của tôi. Bao gồm các bình luận ở trên này ^. Cảm ơn!
vnpnlz

6

Tôi đã có cùng một vấn đề và tôi đã giải quyết bằng cách thay đổi các điều sau trong web.config.

Nó xảy ra với tôi vì tôi đang chạy ứng dụng bằng Newtonsoft.Json 4.0

Từ:

<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>

Đến:

<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>

Đây là giải pháp cho tôi. Tôi đã có một chuyển hướng ràng buộc sang phiên bản cao hơn và nó chỉ hoạt động khi tôi chuyển sang phiên bản thấp hơn.
mrwaim

1
tại sao? Thật lạ đối với tôi. Tôi không sử dụng EF, nhưng tôi nghĩ rằng chúng tôi luôn muốn chuyển sang phiên bản cuối cùng?
Hoàng Long

1
@ HoàngLong vì phiên bản bạn tham khảo là phiên bản cũ hơn, nhưng phiên bản bạn bao gồm là phiên bản mới hơn.
BrainSlugs83

3

Tôi có một cách khác để làm điều này nếu bạn đang sử dụng Nuget để quản lý các phụ thuộc của mình. Tôi đã phát hiện ra rằng đôi khi VS và Nuget không khớp nhau và Nuget không thể nhận ra rằng các dự án của bạn không đồng bộ. Các gói.config sẽ nói một điều nhưng đường dẫn được hiển thị trong Tài liệu tham khảo - Thuộc tính sẽ chỉ ra một thứ khác.

Nếu bạn sẵn sàng cập nhật các phụ thuộc của mình, hãy làm như sau:

  1. Từ Solution Explorer, nhấp chuột phải vào Dự án và nhấp vào 'Quản lý gói Nuget'

  2. Chọn tab 'Gói đã cài đặt' trong khung bên trái Ghi lại các gói đã cài đặt của bạn Bạn có thể muốn sao chép các gói của mình .config vào máy tính để bàn trước nếu bạn có nhiều, vì vậy bạn có thể kiểm tra chéo với Google để xem những gì Nuget pkgs đã được cài đặt

  3. Gỡ cài đặt các gói của bạn. Không sao, chúng tôi sẽ thêm chúng lại ngay.

  4. Ngay lập tức cài đặt các gói bạn cần. Những gì Nuget sẽ làm không chỉ giúp bạn có phiên bản mới nhất mà còn thay đổi các tài liệu tham khảo của bạn và cũng thêm các chuyển hướng ràng buộc cho bạn.

  5. Làm điều này cho tất cả các dự án của bạn.

  6. Ở cấp độ giải pháp, hãy làm sạch và xây dựng lại.

Bạn có thể muốn bắt đầu với các dự án thấp hơn và làm việc theo cách của bạn đến các dự án cấp cao hơn và xây dựng lại từng dự án khi bạn thực hiện.

Nếu bạn không muốn cập nhật phần phụ thuộc của mình, thì bạn có thể sử dụng bảng điều khiển trình quản lý gói và sử dụng cú pháp Update-Gói -ProjectName [yourProjectName] [packName] -Version [versionNumber]


2

Điều này thực sự phụ thuộc vào thành phần bên ngoài của bạn. Khi bạn tham chiếu một thành phần bên ngoài trong một ứng dụng .NET, nó sẽ tạo GUID để xác định thành phần đó. Lỗi này xảy ra khi thành phần bên ngoài được tham chiếu bởi một trong các dự án của bạn có cùng tên và phiên bản khác với thành phần khác trong cụm khác.

Điều này đôi khi xảy ra khi bạn sử dụng "Duyệt" để tìm tài liệu tham khảo và thêm phiên bản lắp ráp sai hoặc bạn có phiên bản khác của thành phần trong kho lưu trữ mã của mình như phiên bản bạn đã cài đặt trong máy cục bộ.

Hãy cố gắng tìm dự án nào có những xung đột này, xóa các thành phần khỏi danh sách tham chiếu, sau đó thêm lại chúng để đảm bảo rằng bạn đang trỏ đến cùng một tệp.


2

=> kiểm tra sẽ có một số trường hợp ứng dụng được cài đặt một phần.

=> trước hết hãy gỡ cài đặt trường hợp đó khỏi ứng dụng gỡ cài đặt.

=> sau đó, dọn dẹp, Xây dựng lại và cố gắng triển khai.

Điều này đã giải quyết vấn đề của tôi. Hy vọng nó cũng giúp bạn. Trân trọng.


1

Cũng có vấn đề này - trong trường hợp của tôi, nguyên nhân là do thuộc tính "Phiên bản cụ thể" trên một số tham chiếu được đặt thành đúng. Thay đổi này thành sai trên các tài liệu tham khảo đã giải quyết vấn đề.


1

Nếu sử dụng NuGet, tất cả những gì tôi phải làm là:

  1. nhấp chuột phải vào dự án và nhấp vào Quản lý gói NuGet ..

  2. nhấp vào răng cưa ở trên cùng bên phải

  3. nhấp vào tab Chung trong Trình quản lý gói NuGet phía trên Nguồn gói

  4. kiểm tra "Bỏ qua Áp dụng chuyển hướng ràng buộc" trong Chuyển hướng liên kết

  5. Làm sạch và xây dựng lại và cảnh báo đã biến mất

Dễ như ăn bánh


1

Tôi chỉ dành đôi khi gỡ lỗi cùng một vấn đề. Lưu ý, vấn đề đó có thể không phải là giữa các dự án khác nhau, mà thực sự là giữa một số tài liệu tham khảo trong một dự án phụ thuộc vào các phiên bản khác nhau của cùng một dll / lắp ráp. Trong trường hợp của tôi, vấn đề là tham khảoFastMember.dll các phiên bản không khớp từ hai gói NuGet khác nhau trong một dự án. Khi tôi được giao một dự án, nó sẽ không biên dịch vì các gói NuGet bị thiếu và VS từ chối khôi phục các gói bị thiếu. Thông qua menu NuGet, tôi cập nhật thủ công tất cả các NuGets lên phiên bản mới nhất, đó là khi cảnh báo xuất hiện.

Trong Visual Studio Tools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics.Hãy tìm (các) dòng There was a conflict betweentrong Outputcửa sổ. Dưới đây là một phần của đầu ra mà tôi nhận được:

1>  There was a conflict between "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null". (TaskId:19)
1>      "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" was chosen because it was primary and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" was not. (TaskId:19)
1>      References which depend on "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" [C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll]. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll". (TaskId:19)
1>              FastMember, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)
1>      References which depend on "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" []. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll". (TaskId:19)
1>              ClosedXML, Version=0.94.2.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)

Thông báo rằng Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll"

ClosedXML.dllđến từ ClosedXMLNuGet và nó phụ thuộc vào FastMember.dll 1.3.0.0. Trên đầu trang, cũng có FastMemberNuget trong dự án, và nó có FastMember.dll 1.5.0.0. Không phù hợp!

Tôi đã gỡ cài đặt ClosedXML& FastMemberNuGets, vì tôi đã chuyển hướng ràng buộc và cài đặt phiên bản mới nhất của ClosedXMLĐiều đó đã khắc phục sự cố!


0

Điều này xảy ra với tôi quá. Một dll được tham chiếu hai lần: một lần trực tiếp (trong tài liệu tham khảo) và một lần gián tiếp (được tham chiếu bởi một dự án được tham chiếu khác). Tôi loại bỏ tham chiếu trực tiếp, làm sạch và xây dựng lại giải pháp. Vấn đề cố định.


0
  1. Mở "Giải pháp thám hiểm".
  2. Nhấp vào "Hiển thị tất cả các tệp"
  3. Mở rộng "Tài liệu tham khảo"
  4. Bạn sẽ thấy một (hoặc nhiều) tài liệu tham khảo có biểu tượng hơi khác so với phần còn lại. Thông thường, nó có hộp màu vàng đề nghị bạn ghi chú lại. Chỉ cần loại bỏ nó.
  5. Thêm tài liệu tham khảo trở lại và biên dịch mã của bạn.
  6. Đó là tất cả.

Trong trường hợp của tôi, có một vấn đề với tham chiếu MySQL. Bằng cách nào đó, tôi có thể liệt kê ba phiên bản của nó trong danh sách tất cả các tài liệu tham khảo có sẵn; cho .net 2.0, .net 4.0 và .net 4.5. Tôi đã làm theo quy trình 1 đến 6 ở trên và nó đã làm việc cho tôi.


0

Một điều khác cần xem xét và kiểm tra là, đảm bảo bạn không có bất kỳ dịch vụ nào đang chạy bằng thư mục bin đó. nếu họ dừng dịch vụ và xây dựng lại giải pháp


0

Dường như có một vấn đề trên Mac Visual Studio khi chỉnh sửa các tệp .resx. Tôi thực sự không biết chuyện gì đã xảy ra, nhưng tôi đã gặp vấn đề này ngay khi tôi chỉnh sửa một số tệp .resx trên máy Mac của mình. Tôi đã mở dự án trên Windows, mở các tệp và chúng như thể chúng chưa được chỉnh sửa. Vì vậy, tôi đã chỉnh sửa chúng, lưu và mọi thứ cũng bắt đầu hoạt động trở lại trên Mac.


0

Tôi đã gặp vấn đề như vậy khi dự án của tôi có tham chiếu đến NETSt ChuẩnL Library và một trong những tập hợp được tham chiếu đã được xuất bản cho netcore. Chỉ cần xuất bản nó là tiêu chuẩn mạng và vấn đề đã biến mất


0

Đây là giải pháp, kiểu .NET Core 3.0: https://github.com/HTD/ref-check

Khi bạn tìm thấy những gì xung đột, có thể bạn sẽ có thể giải quyết các xung đột. Nếu các tham chiếu xung đột là từ các gói khác, bạn sẽ không gặp may hoặc bạn cần sử dụng các nguồn thay thế.

Trong trường hợp của tôi, các gói xung đột thường là của riêng tôi, vì vậy tôi có thể khắc phục các sự cố phụ thuộc và xuất bản lại chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.