Bagaimana cara memperbaiki konflik versi perakitan dengan JSON.NET setelah memperbarui referensi paket NuGet dalam proyek ASP.NET MVC 5 baru?

89

Saya membuat proyek web ASP.NET MVC 5 baru di VS 2013 (Pembaruan 1) kemudian memperbarui semua paket NuGet. Saat saya membangun proyek, saya mendapatkan peringatan berikut:

peringatan MSB3243: Tidak ada cara untuk menyelesaikan konflik antara "Newtonsoft.Json, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed" dan "Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed".

Namun, ketika saya memeriksa web.config, saya melihat bahwa pengalihan yang mengikat sudah ada:

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

Itulah yang disarankan peringatan itu.

Bagaimana cara memperbaiki peringatan ini?

Jim Lamb
sumber
Ya, saya melakukan rekondisi penuh. Saya juga memperbarui NuGet ke yang terbaru, membuat solusi baru dan mereproduksi masalah yang sama persis.
Jim Lamb

Jawaban:

106

Berikut langkah-langkah yang saya gunakan untuk memperbaiki peringatan:

  • Bongkar proyek di VS
  • Edit file .csproj
  • Cari semua referensi untuk perakitan Newtonsoft.Json
    • Ditemukan dua, satu ke v6 dan satu lagi ke v5
    • Ganti referensi ke v5 dengan v6
  • Muat ulang proyek
  • Bangun dan perhatikan kegagalan referensi perakitan
  • Lihat Referensi dan lihat bahwa sekarang ada dua untuk Newtonsoft.Json. Hapus salah satu yang gagal diselesaikan.
  • Rebuild - tidak ada peringatan
Jim Lamb
sumber
12
Saya menemukan dua referensi, satu untuk v6 dan satu untuk v5 tetapi saya menghapus (tidak mengganti) yang v5. Setelah itu saya tidak memiliki masalah seperti "kegagalan referensi perakitan" atau dua referensi ke Newtonsoft.Json di UI. Saya menebak seseorang install.ps1
kesal
Terima kasih atas solusinya. Saya juga menghapus referensi lama dari file proyek dan tidak mengalami masalah.
Charles Prakash Dasari
31
+1 - Saya benar-benar gila ketika harus melakukan hal-hal seperti ini. Itu sebabnya saya selalu ragu untuk mengklik upgrade pada manajer paket nuget.
hylander0
1
Saya mengalami masalah ini dan telah memperbaikinya dengan menghapus referensi tambahan yang tidak saya sadari ada di sana. Ini adalah tautan ke bug Microsoft Connect yang merupakan akar penyebab dari referensi tambahan yang ada di sana: connect.microsoft.com/VisualStudio/feedback/details/816725/… .
Martin Costello
1
Dalam kasus saya, ada referensi ke dua versi berbeda dari Newtonsoft.Json 11.0.1 dan 11.0.2, meskipun itu mengeluh tentang versi 6.0.
Daniel Lobo
31

Saya mengalami masalah ini karena saya memperbarui paket, termasuk Microsoft.AspNet.WebApi yang memiliki referensi ke Newtonsoft.Json 4.5.6 dan saya sudah menginstal versi 6. Tidak cukup pintar untuk menggunakan versi 6.

Untuk mengatasinya, setelah pembaruan WebApi saya membuka Tools> NuGet Package Manager> Pacakge Manager Console dan menjalankan:

 Update-Package Newtonsoft.Json

Log menunjukkan bahwa versi 6.0.x dan 4.5.6 semuanya diperbarui ke yang terbaru dan semuanya baik-baik saja.

Saya merasa ini akan muncul lagi.

McGaz
sumber
1
Saya mengalami masalah dengan beberapa versi berbeda dalam solusi saya yang berisi banyak proyek, ini benar-benar memperbaikinya dan memperbarui semua ke JSON.net terbaru. Bagus!
c0d3p03t
1
Ini adalah solusi termudah dan paling langsung yang memperbaiki masalah saya. Terima kasih!
youngrrrr
21

Saya menemukan menghapus bagian ini dari file proyek memperbaiki masalah.

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

szmulder
sumber
Ini dia. Saya kira tidak ada Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5 yang cocok dengan pengalihan pengikatan '' oldVersion = "0.0.0.0-6.0.0.0" '' Tetapi saya tidak tahu cara menulis yang benar
fantastis
Ini adalah masalah saya juga, saya tidak yakin apa yang menambahkannya.
amnesia
Bekerja untuk saya. Error terkait konflik antara v6.0 dan v12.0. Referensi grup item adalah untuk v11.0. Jadi tidak yakin apa yang terjadi tetapi menghapus grup item tampaknya telah menyelesaikannya, sejauh menghapus kesalahan kompilasi.
Brian.S
13

Jika tidak ada satu pun cara di atas yang berfungsi, coba gunakan ini di web.config atau 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>
ZeroDotNet
sumber
Ini paling cocok untuk situasi ketika Anda memiliki proyek yang sudah ada menggunakan versi yang lebih tinggi dan Anda menambahkan ketergantungan yang menggunakan versi lama dari paket yang sama, jadi Anda mengalihkan versi lama ke yang baru.
Ismail Hawayel
13

Saya meningkatkan dari Newtonsoft.Json 11.0.1 ke 12.0.2. Membuka file proyek di Notepad ++ saya menemukan keduanya

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

dan

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

Saya menghapus ItemGroup yang membungkus referensi dengan jalur petunjuk ke versi 11.0.1.

Masalah ini bisa sangat menjengkelkan untuk ditemukan. Terlebih lagi, pengembang sering mengikuti langkah yang sama seperti penyiapan proyek sebelumnya. Pengaturan sebelumnya tidak mengalami masalah. Untuk alasan apa pun, file proyek terkadang tidak diperbarui dengan benar.

Saya sangat berharap Microsoft akan memperbaiki masalah neraka DLL studio visual ini dari bermunculan. Ini terjadi terlalu sering dan menyebabkan kemajuan berhenti sampai diperbaiki, seringkali dengan coba-coba.

Jeremy Ray Brown
sumber
1
Inilah masalahnya. Terima kasih!
George Fabish
8

Solusi terakhir untuk kesalahan pengalihan perakitan Anda

Oke, semoga ini membantu menyelesaikan setiap ketidaksesuaian referensi perakitan (waras) ...

  1. Periksa kesalahannya.

Jelajahi situs webnya

  1. Periksa web.config setelah pengalihan perakitan. Buat satu jika tidak ada.

Pengalihan perakitan web.config yang ada

  1. Klik kanan referensi untuk perakitan dan pilih Properties.

Majelis dalam daftar Referensi, dalam proyek yang relevan

  1. Periksa Versi (bukan versi Runtime) di tabel Properti. Dimengerti.

Tabel properti menunjukkan Versi perakitan

  1. Tempel ke atribut newVersion.

web.config assembly redirect dengan newVersion yang diperbarui

  1. Untuk kenyamanan, ubah bagian terakhir versi lama menjadi sesuatu yang tinggi, bulat, dan imajiner.

web.config assembly redirect dengan versi oldVersion yang diperbarui

Bersuka cita.


sumber
Jawaban ini menghemat banyak waktu saya! Saya memiliki aplikasi web yang menggunakan pustaka C # khusus, keduanya menggunakan paket nuget yang sama tetapi aplikasi web memiliki versi yang lebih lama dari pustaka dan pengalihan tidak termasuk versi yang digunakan perpustakaan.
War Gravy
4

Ingatlah bahwa dengan pengalihan mengikat

oldVersion = "0.0.0.0-6.0.0.0"

Anda mengatakan bahwa versi lama dll adalah antara versi 0.0.0.0 dan versi 6.0.0.0.

Sherlock-jr
sumber
1
oldVersionsebenarnya sedikit keliru di sini, yang Anda katakan adalah bahwa assembly / exe Anda dibangun dengan referensi ke versi dalam kisaran 0.0.0.0-6.0.0.0dan bahwa versi yang benar-benar diinstal (dan lebih disukai) adalah nilai di bawah newVersion(versi lama akan lebih baik diutarakan sebagai "versi yang diharapkan" dan versi baru akan lebih baik diungkapkan sebagai "sebenarnya versi yang tersedia")
nothingisnecessary
2

Tidak ada yang menyebutkan hal berikut, yang menurut pemahaman saya adalah solusi yang tepat:

Pergi ke csproj proyek tempat nuget dipasang, dan setel AutoGEneratedBindingRedirectske false.

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

Artikel lengkap di MSDN.

Veverke
sumber
1

Saya memperbarui paket saya dan bahkan menginstalnya kembali - tetapi saya masih mendapatkan kesalahan yang sama persis dengan yang disebutkan OP. Saya secara manual mengedit dll yang direferensikan dengan melakukan hal berikut.

Saya menghapus newtonsoft.json.dll dari referensi saya, kemudian secara manual menghapus .dll dari bin directoy. Kemudian saya secara manual menyalin newtonsoft.json.dll dari folder paket nuget ke dalam bin proyek, kemudian menambahkan referensi dengan browsing ke file .dll.

Sekarang proyek saya dibangun lagi.

Adam Heeg
sumber
0

Saya memiliki masalah serupa dan hanya ingin memposting jawaban untuk orang lain dalam situasi saya.

Saya memiliki solusi yang menjalankan Aplikasi Web ASP.NET dengan beberapa proyek lib kelas C # lainnya.

Aplikasi Web ASP.NET saya tidak menggunakan json, tetapi proyek lain di mana.

Beginilah cara saya memperbaikinya:

  1. Saya memastikan semua proyek yang menggunakan versi terbaru (6) menggunakan Pembaruan NuGet pada semua proyek yang saat ini menggunakan versi json apa pun - ini tidak memperbaiki masalah
  2. Saya menambahkan json ke aplikasi web menggunakan NuGet - ini memperbaiki masalah (mari saya selami mengapa):

Langkah 2 adalah pertama-tama menambahkan informasi konfigurasi untuk json, yang menyarankan bahwa semua proyek, gunakan versi terbaru (6) tidak peduli versi apa yang mereka miliki. Menambahkan assembly binding ke Web.Config kemungkinan besar adalah perbaikannya.

Namun, langkah 2 juga membersihkan beberapa kode lama. Ternyata kami sebelumnya telah menggunakan versi lama (5) json di Aplikasi Web kami dan folder NuGet tidak dihapus ketika referensi (saya curiga: secara manual) dihapus. Menambahkan json terbaru (6), menghapus folder lama (json v5). Ini mungkin bagian dari perbaikan juga.

Nick Niebling
sumber
0

Veverke menyebutkan bahwa dimungkinkan untuk menonaktifkan pembuatan pengalihan yang mengikat dengan menyetel AutoGEneratedBindingRedirects ke false. Tidak yakin apakah ini hal baru sejak pertanyaan ini dikirim, tetapi ada opsi "Lewati penerapan pengalihan pengikatan" di Alat / Opsi / Nuget Packet Manager, yang dapat diubah. Secara default tidak aktif, yang berarti pengalihan akan diterapkan. Namun jika Anda melakukan ini, Anda harus mengelola pengalihan pengikatan yang diperlukan secara manual.

Svein Terje Gaup
sumber