Làm cách nào để khắc phục xung đột phiên bản lắp ráp với JSON.NET sau khi cập nhật tham chiếu gói NuGet trong dự án ASP.NET MVC 5 mới?


89

Tôi đã tạo một dự án web ASP.NET MVC 5 mới trong VS 2013 (Cập nhật 1) sau đó cập nhật tất cả các gói NuGet. Khi tôi xây dựng dự án, tôi nhận được cảnh báo sau:

cảnh báo MSB3243: Không có cách nào để giải quyết xung đột giữa "Newtonsoft.Json, Phiên bản = 6.0.0.0, Văn hóa = trung lập, PublicKeyToken = 30ad4fe6b2a6aeed" và "Newtonsoft.Json, Phiên bản = 4.5.0.0, Văn hóa = trung lập, PublicKeyToken = 30ad4fe6b2a6aeed".

Tuy nhiên, khi tôi kiểm tra web.config, tôi thấy rằng có một chuyển hướng ràng buộc:

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

Đó là chính xác những gì cảnh báo khuyên.

Làm cách nào để khắc phục cảnh báo này?


Vâng, tôi đã xây dựng lại toàn bộ. Tôi cũng cập nhật NuGet lên phiên bản mới nhất, tạo giải pháp mới và tái tạo chính xác vấn đề tương tự.
Jim Lamb

Câu trả lời:


106

Đây là các bước tôi đã sử dụng để khắc phục cảnh báo:

  • Dỡ dự án trong VS
  • Chỉnh sửa tệp .csproj
  • Tìm kiếm tất cả các tham chiếu đến Newtonsoft.Json assembly
    • Đã tìm thấy hai, một cho v6 và một cho v5
    • Thay thế tham chiếu đến v5 bằng v6
  • Tải lại dự án
  • Xây dựng và thông báo lỗi tham chiếu lắp ráp
  • Xem Tài liệu tham khảo và thấy rằng bây giờ có hai tài khoản cho Newtonsoft.Json. Loại bỏ một trong những không giải quyết được.
  • Xây dựng lại - không có cảnh báo

12
Tôi đã tìm thấy hai tham chiếu, một cho v6 và một cho v5 nhưng tôi đã xóa (không thay thế) bản v5. Sau đó, tôi không gặp bất kỳ sự cố nào như "lỗi tham chiếu lắp ráp" hoặc hai tham chiếu đến Newtonsoft.Json trong giao diện người dùng. Tôi đoán ai đó đã nhồi nhétinstall.ps1
ta.speot.is

Cảm ơn vì giải pháp. Tôi cũng đã xóa tham chiếu cũ hơn khỏi tệp dự án và không gặp vấn đề gì.
Charles Prakash Dasari

31
+1 - Nó thực sự khiến tôi phát điên khi phải làm những việc như thế này. Đó là lý do tại sao tôi luôn do dự khi nhấp vào nâng cấp trên trình quản lý gói nuget.
hylander0

1
Tôi đang gặp sự cố này và đã khắc phục nó bằng cách xóa tham chiếu bổ sung mà tôi không nhận ra là ở đó. Đây là liên kết đến lỗi Microsoft Connect là nguyên nhân gốc rễ của tham chiếu bổ sung ở đó: connect.microsoft.com/VisualStudio/feedback/details/816725/… .
Martin Costello

1
Trong trường hợp của tôi, có liên quan đến hai phiên bản khác nhau của Newtonsoft.Json 11.0.1 và 11.0.2, mặc dù nó đã phàn nàn về phiên bản 6.0.
Daniel Lobo,

31

Tôi gặp sự cố này vì tôi đã cập nhật các gói, bao gồm Microsoft.AspNet.WebApi có tham chiếu đến Newtonsoft.Json 4.5.6 và tôi đã cài đặt phiên bản 6. Nó không đủ thông minh để sử dụng phiên bản 6.

Để giải quyết vấn đề này, sau khi cập nhật WebApi, tôi đã mở Tools> NuGet Package Manager> Pacakge Manager Console và chạy:

 Update-Package Newtonsoft.Json

Nhật ký cho thấy phiên bản 6.0.x và 4.5.6 đều được cập nhật lên phiên bản mới nhất và mọi thứ đều ổn.

Tôi có cảm giác điều này sẽ xuất hiện một lần nữa.


1
Tôi đang gặp sự cố với nhiều phiên bản khác nhau trong giải pháp của mình có chứa nhiều dự án, điều này đã khắc phục hoàn toàn và cập nhật tất cả lên JSON.net mới nhất. Đẹp!
c0d3p03t

1
Đây là giải pháp đơn giản nhất, dễ hiểu nhất đã khắc phục sự cố của tôi. Cảm ơn!
youngrrrr

21

Tôi thấy xóa phần này khỏi tệp dự án đã khắc phục được sự cố.

<ItemGroup>
<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>


Đây là nó. Tôi cho rằng không có Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5 nào phù hợp với chuyển hướng liên kết '' oldVersion = "0.0.0.0-6.0.0.0" '' Nhưng tôi không biết cách viết đúng
fantastory

Đây cũng là vấn đề của tôi, tôi không chắc điều gì đã thêm vào nó.
mất trí nhớ

Đã làm cho tôi. Lỗi liên quan đến xung đột giữa v6.0 và v12.0. Tham chiếu nhóm mặt hàng là v11.0. Vì vậy, không chắc chắn điều gì đang xảy ra nhưng việc xóa nhóm mục dường như đã giải quyết được nó, cũng như loại bỏ lỗi biên dịch.
Brian.S

13

Nếu không có cách nào ở trên hoạt động, hãy thử sử dụng điều này trong web.config hoặc app.config:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <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>
    </assemblyBinding>
</runtime>

Điều này phù hợp nhất cho tình huống khi bạn có một dự án hiện tại sử dụng phiên bản cao hơn và bạn thêm một phần phụ thuộc đang sử dụng phiên bản cũ hơn của cùng một gói, vì vậy bạn chuyển hướng phiên bản cũ sang phiên bản mới.
Ismail Hawayel

13

Tôi đã nâng cấp từ Newtonsoft.Json 11.0.1 lên 12.0.2. Mở tệp dự án trong Notepad ++, tôi đã phát hiện ra cả hai

<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

Tôi đã xóa gói ItemGroup tham chiếu với đường dẫn gợi ý đến phiên bản 11.0.1.

Những vấn đề này có thể gây khó chịu khi tìm kiếm. Hơn nữa, các nhà phát triển thường làm theo các bước giống như thiết lập dự án trước đó. Các thiết lập trước không gặp sự cố. Vì bất kỳ lý do gì mà tệp dự án đôi khi được cập nhật không chính xác.

Tôi rất mong Microsoft sẽ khắc phục các vấn đề về địa ngục DLL của studio trực quan này từ việc bật lên. Nó xảy ra quá thường xuyên và khiến tiến độ bị đình trệ cho đến khi nó được khắc phục, thường là do thử và sai.


1
Đây chính xác là vấn đề. Cảm ơn!
George Fabish

8

Giải pháp cuối cùng cho lỗi chuyển hướng lắp ráp của bạn

Được rồi, hy vọng điều này sẽ giúp giải quyết bất kỳ sự khác biệt nào về tham chiếu lắp ráp (lành mạnh) ...

  1. Kiểm tra lỗi.

Lướt đến trang web

  1. Kiểm tra web.config sau khi chuyển hướng lắp ráp. Tạo một nếu không tồn tại.

Chuyển hướng lắp ráp web.config hiện có

  1. Bấm chuột phải vào tham chiếu cho hợp ngữ và chọn Thuộc tính.

Lắp ráp trong danh sách Tham khảo, trong dự án liên quan

  1. Kiểm tra Phiên bản (không phải phiên bản Thời gian chạy) trong bảng Thuộc tính. Sao chép cái đó.

Bảng thuộc tính hiển thị Phiên bản của lắp ráp

  1. Dán vào thuộc tính newVersion.

chuyển hướng lắp ráp web.config với phiên bản mới được cập nhật

  1. Để thuận tiện, hãy thay đổi phần cuối cùng của oldVersion thành một thứ gì đó cao, tròn và tưởng tượng.

chuyển hướng lắp ráp web.config với oldVersion được cập nhật

Hân hoan.


Câu trả lời này đã tiết kiệm thời gian cho tôi! Tôi có một ứng dụng web đang sử dụng thư viện C # tùy chỉnh, cả hai đều sử dụng cùng một gói nuget nhưng ứng dụng web có phiên bản cũ hơn thư viện và chuyển hướng không bao gồm phiên bản mà thư viện đang sử dụng.
War Gravy

4

Hãy nhớ rằng với chuyển hướng ràng buộc

oldVersion = "0.0.0.0-6.0.0.0"

Bạn đang nói rằng các phiên bản cũ của dll nằm giữa phiên bản 0.0.0.0 và phiên bản 6.0.0.0.


1
oldVersionthực sự là một chút nhầm lẫn ở đây, những gì bạn đang nói là assembly / exe của bạn được xây dựng với tham chiếu đến một phiên bản trong phạm vi 0.0.0.0-6.0.0.0và rằng phiên bản thực sự được cài đặt (và được ưu tiên) là giá trị dưới newVersion(phiên bản cũ sẽ tốt hơn là "phiên bản dự kiến" và phiên bản mới sẽ được phrased tốt hơn là "phiên bản có sẵn thực tế")
nothingisnecessary

2

Không ai đề cập đến điều sau đây, theo tôi hiểu là giải pháp chính xác:

Tới csproj của dự án nơi NuGet được cài đặt, và thiết lập AutoGEneratedBindingRedirectsđể false.

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

Toàn bộ bài báo trong MSDN.


1

Tôi đã cập nhật gói của mình và thậm chí cài đặt lại nó - nhưng tôi vẫn gặp lỗi chính xác như OP đã đề cập. Tôi đã chỉnh sửa thủ công dll được tham chiếu bằng cách làm như sau.

Tôi đã xóa newtonsoft.json.dll khỏi tài liệu tham khảo của mình, sau đó xóa thủ công .dll khỏi bin directoy. Sau đó, tôi đã sao chép thủ công newtonsoft.json.dll từ thư mục gói nuget vào thùng dự án, sau đó thêm tham chiếu bằng cách duyệt đến tệp .dll.

Bây giờ dự án của tôi lại xây dựng.


0

Tôi đã gặp vấn đề tương tự và chỉ muốn đăng câu trả lời cho những người khác trong hoàn cảnh của tôi.

Tôi có một giải pháp chạy Ứng dụng Web ASP.NET với nhiều dự án lib lớp C # khác.

Ứng dụng Web ASP.NET của tôi không sử dụng json, nhưng các dự án khác ở đâu.

Đây là cách tôi sửa nó:

  1. Tôi đã đảm bảo tất cả các dự án sử dụng phiên bản mới nhất (6) bằng NuGet Update trên tất cả các dự án hiện đang sử dụng bất kỳ phiên bản json nào - điều này không khắc phục được sự cố
  2. Tôi đã thêm json vào ứng dụng web bằng NuGet - điều này đã khắc phục sự cố (hãy để tôi đi sâu vào lý do):

Bước 2 trước hết là thêm thông tin cấu hình cho json, đề xuất rằng tất cả các dự án, hãy sử dụng phiên bản mới nhất (6) cho dù chúng có phiên bản nào. Thêm liên kết lắp ráp vào Web.Config rất có thể là giải pháp khắc phục.

Tuy nhiên, bước 2 cũng làm sạch mã kế thừa som. Hóa ra trước đây chúng tôi đã sử dụng phiên bản cũ (5) của json trong Ứng dụng web của mình và các thư mục NuGet không bị xóa khi tham chiếu bị xóa (tôi nghi ngờ: theo cách thủ công). Thêm json mới nhất (6), xóa các thư mục cũ (json v5). Đây cũng có thể là một phần của bản sửa lỗi.


0

Veverke đã đề cập rằng có thể vô hiệu hóa việc tạo chuyển hướng ràng buộc bằng cách đặt AutoGEneratedBindingRedirects thành false. Không chắc đó có phải là một điều mới kể từ khi câu hỏi này được đăng hay không, nhưng có một tùy chọn "Bỏ qua áp dụng chuyển hướng ràng buộc" trong Công cụ / Tùy chọn / Trình quản lý gói Nuget, có thể được bật tắt. Theo mặc định, nó bị tắt, có nghĩa là các chuyển hướng sẽ được áp dụng. Tuy nhiên, nếu bạn làm điều này, bạn sẽ phải quản lý bất kỳ chuyển hướng ràng buộc cần thiết nào theo cách thủ cô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.