Peringatan: Konflik yang ditemukan antara versi yang berbeda dari rakitan dependen yang sama

320

Saat ini saya sedang mengembangkan aplikasi .NET, yang terdiri dari 20 proyek. Beberapa dari proyek tersebut dikompilasi menggunakan .NET 3.5, beberapa lainnya masih .NET 2.0 proyek (sejauh ini tidak ada masalah).

Masalahnya adalah bahwa jika saya memasukkan komponen eksternal saya selalu mendapatkan peringatan berikut:

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

Apa sebenarnya arti peringatan ini dan apakah mungkin ada kemungkinan untuk mengecualikan peringatan ini (seperti menggunakan #pragma disable di file kode sumber)?

Olifant
sumber

Jawaban:

410

Peringatan ini berarti bahwa dua proyek mereferensikan perakitan yang sama (misalnya System.Windows.Forms) tetapi kedua proyek tersebut membutuhkan versi yang berbeda. Anda punya beberapa pilihan:

  1. Kompilasi ulang semua proyek untuk menggunakan versi yang sama (mis. Pindahkan semua ke .Net 3.5). Ini adalah opsi yang lebih disukai karena semua kode berjalan dengan versi dependensi yang dikompilasi dengannya.

  2. Tambahkan pengalihan yang mengikat . Ini akan menekan peringatan. Namun, proyek .Net 2.0 Anda akan (saat runtime) terikat ke versi .Net 3.5 dari kumpulan bergantung seperti System.Windows.Forms. Anda dapat dengan cepat menambahkan pengalihan yang mengikat dengan mengklik dua kali pada kesalahan di Visual Studio.

  3. Gunakan CopyLocal=true. Saya tidak yakin apakah ini akan menekan peringatan. Ini akan, seperti opsi 2 di atas, berarti bahwa semua proyek akan menggunakan versi .Net 3.5 dari System.Windows.Forms.

Berikut adalah beberapa cara untuk mengidentifikasi referensi yang menyinggung:

  • Anda dapat menggunakan utilitas seperti yang ditemukan di https://gist.github.com/1553265
  • Metode sederhana lain adalah dengan mengatur Build output verbosity (Alat, Opsi, Proyek dan Solusi, Build and Run, proyek MSBuild build output verbosity, Detail) dan setelah membangun, cari jendela output untuk peringatan, dan lihat teks tepat di atasnya . (Hat tip untuk pauloya yang menyarankan ini di komentar pada jawaban ini) .
Brian Low
sumber
9
Hanya untuk satu cara cepat untuk menemukannya tanpa utilitas - jika Anda menambahkan pengalihan mengikat (seperti opsi 2), itu akan menunjukkan ada referensi yang terlibat - jika diinginkan, Anda kemudian dapat menggunakan salah satu metode lain untuk menanganinya, dan hapus pengalihan yang mengikat dari file konfigurasi Anda.
Brisbe
222
Cara paling sederhana untuk menemukan apa yang menjadi "referensi yang menyinggung" adalah dengan mengatur Build output verbosity (Alat, Opsi, Proyek dan Solusi, Build and Run, proyek MSBuild membangun output verbosity, Detail) dan setelah membangun, cari jendela output untuk peringatan. Lihat teks di atasnya.
pauloya
7
Mengikat pengalihan dengan peringatan klik ganda (langkah 2) tidak menghapus peringatan saya. Saya melihat app.config ditambahkan dengan majelis yang saya duga penyebabnya, tetapi peringatan itu masih ada setelah bersih / dibangun kembali. Selain itu coba juga langkah 3, tidak berhasil. Ada ide?
angularsen
9
Bagaimana jika itu bukan referensi dari proyek Anda sendiri? Sebagai contoh, saya mereferensikan proyek, yang memiliki ketergantungan pada Newtonsoft.Json, Versi = 6.0.0.0, dan saya referensi proyek lain, yang memiliki ketergantungan pada Newtonsoft.Json, Versi = 4.5.0.0
Edward Ned Harvey
3
@ brian-low, bolehkah saya menyarankan menambahkan pengaturan verbosity output Build (seperti yang disarankan dalam komentar oleh @pauloya) sebagai opsi dalam jawaban Anda di samping utilitas yang ditautkan? (Penafian, saya benar-benar mencoba untuk mengedit jawaban untuk melakukan hal itu tetapi ditolak setelah ditinjau :))
Rick Riensche
44

Pada dasarnya ini terjadi ketika majelis yang Anda rujuk memiliki "Salin Lokal" diatur ke "Benar", yang berarti bahwa salinan DLL ditempatkan di folder tempat sampah bersama dengan exe Anda.

Karena Visual Studio juga akan menyalin semua dependensi rakitan yang direferensikan, mungkin saja berakhir dengan dua build berbeda dari rakitan yang sama yang dirujuk. Ini lebih mungkin terjadi jika proyek Anda berada dalam solusi terpisah, dan karenanya dapat dikompilasi secara terpisah.

Cara saya mengatasinya adalah dengan mengatur Salin Lokal ke Salah untuk referensi dalam proyek perakitan. Hanya lakukan untuk aplikasi yang dapat dieksekusi / web di mana Anda memerlukan perakitan untuk menjalankan produk jadi.

Harapan itu masuk akal!

Matt Hamilton
sumber
31

Saya ingin memposting solusi pauloya yang mereka berikan di komentar di atas. Saya percaya ini adalah solusi terbaik untuk menemukan referensi yang menyinggung.

Cara paling sederhana untuk menemukan apa yang menjadi "referensi yang menyinggung" adalah dengan mengatur Build output verbosity (Alat, Opsi, Proyek dan Solusi, Build and Run, proyek MSBuild membangun output verbosity, Detail) dan setelah membangun, cari jendela output untuk peringatan. Lihat teks di atasnya.

Misalnya, ketika Anda mencari "konflik" di panel output Anda mungkin menemukan sesuatu seperti ini:

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.

Seperti yang Anda lihat, ada konflik antara EF versi 5 dan 6.

pengguna1477388
sumber
3
Tetapi sekarang saya memiliki informasi ini, bagaimana cara menghapus kesalahan? Saya dapat melihat apa konfliknya, tetapi saya tidak dapat menemukan di mana proyek ini merujuk pada versi yang bertentangan
Bassie
Hai @Bassie, hal pertama yang harus dilakukan adalah memeriksa file paket nuget Anda dan menentukan apakah Anda perlu memperbarui semua file ke versi paket yang sama. Anda dapat melakukan ini dengan menjalankan perintah yang mirip dengan update-package [your package name] -version 6.0.0 -reinstalljawaban saya di sini stackoverflow.com/questions/22685530/…
user1477388
@Bassie, Anda bisa melakukan apa yang disarankan peringatan, dan menambahkan pengalihan yang mengikat ke file app.config! (jika memperbarui bukanlah suatu pilihan, yaitu.)
BrainSlugs83
@Bassie lihat jawaban saya, di mana saya menunjukkan kepada Anda memiliki Anda bagaimana untuk mendapatkan majelis yang berbeda /. Dll yang menyebabkan masalah mismatch.
cetakan baru
22

Saya memiliki masalah yang sama dengan salah satu proyek saya, namun, tidak satu pun di atas yang membantu menyelesaikan peringatan. Saya memeriksa detail logfile build, saya menggunakan AsmSpy untuk memverifikasi bahwa saya menggunakan versi yang benar untuk setiap proyek dalam solusi yang terpengaruh, saya mengecek entri yang sebenarnya di setiap file proyek - tidak ada yang membantu.

Akhirnya ternyata masalahnya adalah ketergantungan yang bersarang dari salah satu referensi yang saya miliki dalam satu proyek. Referensi ini (A) pada gilirannya memerlukan versi (B) yang berbeda yang direferensikan langsung dari semua proyek lain dalam solusi saya. Memperbarui referensi dalam proyek yang dirujuk menyelesaikannya.

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)

Saya harap penjelasan di atas menunjukkan apa yang saya maksud, butuh beberapa jam untuk mencari tahu, jadi semoga orang lain juga mendapat manfaat.

Gorgsenegger
sumber
1
Masalah yang sama disini. Namun, saya tidak memiliki kesempatan untuk memperbarui referensi ke versi yang lebih baru. Saya mencoba menggunakan App.config: ketika berfungsi untuk aplikasi, Visual Studio 2010 tampaknya mengabaikannya saat dibuat.
Thomas Weller
1
wow, saya punya masalah ini selama dua bulan dan tidak bisa menunjukkan dan menyelesaikannya. Untuk beberapa alasan itu akan crash hanya selama debugging dan dalam beberapa kasus, itu secara manual akan menggantikan .dll mengganggu dengan yang asli di folder bin ketika itu akan terjadi. Debugging benar-benar menyakitkan. Ketika saya membaca jawaban Anda, saya menyadari ini persis apa yang terjadi pada saya dan saya memperbaikinya dalam waktu 5 menit :)
Dennis Puzak
19

Pada Visual Studio jika Anda klik kanan pada solusi dan Kelola paket nuget ada tab "Konsolidasi" yang mengatur semua paket ke versi yang sama.

Tiago Gouvêa
sumber
Terima kasih atas tipnya. Kali ini tidak membantu saya, tetapi senang mengetahui bahwa itu ada di sana.
BrainSlugs83
8

Saya baru saja menerima pesan peringatan ini dan membersihkan solusinya dan mengkompilasi ulang (Build -> Clean Solution) dan hilang.

MoMo
sumber
9
Hanya sampai Anda membangun kembali solusinya
Lukas
Ini menyelamatkan saya! Saya sudah mencoba solusi lain sejak kemarin tetapi yang ini menyelesaikan masalah saya. Termasuk komentar di atas ini ^. Terima kasih!
vnpnlz
6

Saya memiliki masalah yang sama dan saya menyelesaikannya dengan mengubah yang berikut di web.config.

Itu terjadi pada saya karena saya menjalankan aplikasi menggunakan Newtonsoft.Json 4.0

Dari:

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

Untuk:

<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>
Phil50
sumber
Ini solusi untuk saya. Saya memiliki pengalihan yang mengikat ke versi yang lebih tinggi, dan itu hanya berfungsi setelah saya pindah ke versi yang lebih rendah.
mrwaim
1
Mengapa? Sangat aneh bagi saya. Saya tidak menggunakan EF, tetapi saya pikir kami selalu ingin pindah ke versi terakhir?
Hoàng Long
1
@ HoàngLong karena versi yang Anda referensikan adalah versi yang lebih lama, tetapi versi yang Anda sertakan adalah yang lebih baru.
BrainSlugs83
3

Saya punya cara lain untuk melakukan ini jika Anda menggunakan Nuget untuk mengelola dependensi Anda. Saya menemukan bahwa kadang-kadang VS dan Nuget tidak cocok dan Nuget tidak dapat mengenali bahwa proyek Anda tidak sinkron. Packages.config akan mengatakan satu hal tetapi jalur yang ditunjukkan dalam Referensi - Properti akan menunjukkan sesuatu yang lain.

Jika Anda ingin memperbarui dependensi Anda, lakukan hal berikut:

  1. Dari Solution Explorer, klik kanan Proyek dan klik 'Kelola Paket Nuget'

  2. Pilih tab 'Paket yang terinstal' di panel kiri. Rekam paket yang Anda instal. Anda mungkin ingin menyalin paket Anda. Konfigurasikan ke desktop Anda terlebih dahulu jika Anda memiliki banyak, sehingga Anda dapat mengeceknya dengan Google untuk melihat apa pkgs Nuget yang diinstal

  3. Copot paket Anda. Tidak apa-apa, kita akan menambahkannya kembali.

  4. Segera instal paket yang Anda butuhkan. Apa yang akan dilakukan Nuget tidak hanya membuat Anda mendapatkan versi terbaru, tetapi juga akan mengubah referensi Anda, dan juga menambahkan pengalihan yang mengikat untuk Anda.

  5. Lakukan ini untuk semua proyek Anda.

  6. Pada level solusi, lakukan Clean and Rebuild.

Anda mungkin ingin memulai dengan proyek yang lebih rendah dan bekerja dengan cara yang lebih tinggi, dan membangun kembali setiap proyek sambil berjalan.

Jika Anda tidak ingin memperbarui dependensi Anda, maka Anda dapat menggunakan konsol pengelola paket, dan menggunakan sintaks Pembaruan-Paket -ProjectName [namaProyek] [namaProject] -Versi [versionNumber]

Tagihan
sumber
2

Ini sebenarnya tergantung pada komponen eksternal Anda. Ketika Anda mereferensikan komponen eksternal dalam aplikasi .NET itu menghasilkan GUID untuk mengidentifikasi komponen itu. Kesalahan ini terjadi ketika komponen eksternal yang direferensikan oleh salah satu proyek Anda memiliki nama yang sama dan versi yang berbeda dengan komponen lain di majelis lain.

Ini kadang-kadang terjadi ketika Anda menggunakan "Browse" untuk menemukan referensi dan menambahkan versi perakitan yang salah, atau Anda memiliki versi komponen yang berbeda dalam repositori kode Anda seperti yang Anda instal di mesin lokal.

Cobalah untuk menemukan proyek mana yang memiliki konflik ini, hapus komponen dari daftar referensi, lalu tambahkan lagi memastikan Anda menunjuk ke file yang sama.

Jon Limjap
sumber
2

=> periksa akan ada beberapa contoh aplikasi yang diinstal sebagian.

=> pertama-tama hapus instalan itu dari aplikasi uninstall.

=> lalu, bersihkan, Bangun kembali, dan coba gunakan.

ini memecahkan masalah saya. Semoga ini membantu Anda juga. Salam Hormat.

Neelam Prajapati
sumber
1

Juga memiliki masalah ini - dalam kasus saya itu disebabkan oleh memiliki properti "Versi Khusus" pada sejumlah referensi yang disetel ke true. Mengubah ini menjadi salah pada referensi tersebut menyelesaikan masalah.

Tristan Lewis
sumber
1

Jika menggunakan NuGet yang harus saya lakukan adalah:

  1. klik kanan proyek dan klik Kelola Paket NuGet ..

  2. klik roda gigi di kanan atas

  3. klik tab Umum di Pengelola Paket NuGet di atas Sumber Paket

  4. centang "Lewati Menerapkan pengalihan yang mengikat" di Binding Redirects

  5. Bersihkan dan bangun kembali dan peringatan itu hilang

Peasy mudah

0tombo0
sumber
1

Saya baru saja menghabiskan waktu men-debug masalah yang sama. Catatan, masalah itu mungkin bukan antara proyek yang berbeda, tetapi sebenarnya antara beberapa referensi dalam satu proyek yang bergantung pada versi berbeda dari dll / perakitan yang sama. Dalam kasus saya, masalah adalah FastMember.dllversi referensi yang tidak cocok yang berasal dari dua paket NuGet yang berbeda dalam satu proyek. Ketika saya diberi proyek, itu tidak akan dikompilasi karena paket NuGet hilang dan VS menolak untuk mengembalikan paket yang hilang. Melalui menu NuGet, saya memperbarui secara manual semua NuGets ke versi terbaru, saat itulah peringatan muncul.

Di Visual Studio Tools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics.Cari baris There was a conflict betweendi Outputjendela. Di bawah ini adalah bagian dari output yang saya dapatkan:

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)

Perhatikan itu 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.dllberasal dari ClosedXMLNuGet dan itu tergantung pada FastMember.dll 1.3.0.0. Di atas itu, ada juga FastMemberNuget di proyek, dan itu FastMember.dll 1.5.0.0. Ketidakcocokan!

Saya telah mencopot ClosedXML& FastMemberNuGets, karena saya telah mengikat pengalihan dan menginstal hanya versi terbaru dari ClosedXMLItu memperbaiki masalah!

cetakan baru
sumber
0

Ini juga terjadi pada saya. Satu dll direferensikan dua kali: sekali secara langsung (dalam referensi) dan sekali tidak langsung (dirujuk oleh proyek referensi lain). Saya menghapus referensi langsung, membersihkan & membangun kembali solusi. Masalah diperbaiki.

Igor Gorjanc
sumber
0
  1. Buka "Solution Explorer".
  2. Klik pada "Tampilkan semua file"
  3. Luaskan "Referensi"
  4. Anda akan melihat satu (atau lebih) referensi dengan ikon yang sedikit berbeda dari yang lain. Biasanya, ini dengan kotak kuning menyarankan Anda untuk mencatatnya. Hapus saja.
  5. Tambahkan referensi kembali dan kompilasi kode Anda.
  6. Itu saja.

Dalam kasus saya, ada masalah dengan referensi MySQL. Entah bagaimana, saya bisa mendaftar tiga versi di bawah daftar semua referensi yang tersedia; untuk .net 2.0, .net 4.0 dan .net 4.5. Saya mengikuti proses 1 hingga 6 di atas dan itu berhasil untuk saya.

Sukhi
sumber
0

Hal lain yang perlu dipertimbangkan dan diperiksa adalah, pastikan Anda tidak memiliki layanan yang menggunakan folder bin itu. jika mereka menghentikan layanan dan membangun kembali solusi

Telwa Gangnam
sumber
0

Tampaknya ada masalah pada Mac Visual Studio saat mengedit file .resx. Saya tidak benar-benar tahu apa yang terjadi, tetapi saya mendapatkan masalah ini segera setelah saya mengedit beberapa file .resx pada Mac saya. Saya membuka proyek di Windows, membuka file dan seolah-olah belum diedit. Jadi saya mengeditnya, menyimpan, dan semuanya mulai bekerja lagi di Mac juga.

Dpedrinha
sumber
0

Saya memiliki masalah seperti itu ketika proyek saya memiliki referensi ke NETStandardLibrary dan salah satu majelis referensi diterbitkan untuk netcore. Baru saja mempublikasikannya sebagai netstandard dan masalah telah hilang

Jacek Plesnar
sumber
0

Inilah solusinya, gaya .NET Core 3.0: https://github.com/HTD/ref-check

Ketika Anda menemukan konflik apa, mungkin Anda akan dapat menyelesaikan konflik tersebut. Jika referensi yang bertentangan berasal dari paket lain, Anda kurang beruntung, atau Anda perlu menggunakan sumber.

Dalam kasus saya, paket-paket yang saling bertentangan seringkali milik saya sendiri, jadi saya bisa memperbaiki masalah ketergantungan dan menerbitkannya kembali.

Harry
sumber