Konflik yang ditemukan antara versi berbeda dari rakitan dependen yang sama yang tidak dapat diselesaikan

372

Ketika saya membersihkan dan kemudian membangun solusi saya yang memiliki beberapa proyek, jendela output melaporkan bahwa build berhasil. Namun, ketika saya melihat Jendela Daftar Kesalahan , ini menunjukkan kepada saya peringatan ini:

Konflik yang ditemukan antara versi berbeda dari rakitan dependen yang sama yang tidak dapat diselesaikan. Konflik referensi ini tercantum dalam log bangunan ketika verbositas log diatur ke detail. C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets

Ketika saya mengklik dua kali pesan ini, itu membuka file C: \ Program (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets file tetapi saya tidak mengerti apa-apa di dalamnya.

Saya menggunakan Visual Studio Express 2013 untuk Web.

Bagaimana cara mencari tahu apa yang salah dan dengan DLL mana dan bagaimana cara membuat peringatan itu pergi?

Pendingin Air v2
sumber
2
Lihat juga ... stackoverflow.com/questions/1871073/
SteveC
2
Saya mengirim saran ke MS Connect untuk memasukkan nama DLL dalam pesan connect.microsoft.com/VisualStudio/feedback/details/2619450
Michael Freidgeim

Jawaban:

513

eta: Ada artikel pembunuh tentang hal ini oleh @Nick Craver milik SO yang harus Anda baca


Sementara tanggapan lain mengatakan ini, mereka tidak membuatnya eksplisit, jadi saya akan ....

Pada VS2013.2, untuk benar-benar memicu emisi informasi yang dikutip, Anda tidak perlu membaca pesan yang berbunyi:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): peringatan MSB3277: Ditemukan konflik antara versi berbeda dari rakitan dependen yang sama yang tidak dapat diselesaikan. Konflik referensi ini tercantum dalam log bangunan ketika verbositas log diatur ke detail .

Ini tidak benar (atau setidaknya itu untuk beberapa versi Visual Studio - tampaknya OK pada pembaruan VS2015 3 atau yang terbaru). Alih-alih mengubahnya ke Diagnostic (dari Tools-> Options-> Project and Solutions-> Build and Run , atur MSBuild project build output verbosity ), di mana Anda akan melihat pesan seperti:

Ada konflik antara "Newtonsoft.Json, Versi = 6.0.0.0, Budaya = netral, PublicKeyToken = 30ad4fe6b2a6aeed" dan "Newtonsoft.Json, Versi = 6.0.5.17707, Culture = netral, PublicKeyToken = 30ad4fe6b2a6aeed".

  • "Newtonsoft.Json, Versi = 6.0.0.0, Budaya = netral, PublicKeyToken = 30ad4fe6b2a6aeed" dipilih karena itu adalah primer dan "Newtonsoft.Json, Versi = 6.0.5.17707, Budaya = netral, PublicKeyToken = 30ad4fe6b2a6aeed" tidak.

Kemudian

  • Ctrl-Alt-O untuk pergi ke Build output window
  • cari " terpilih " untuk menemukan drilldown.

... Dan ya, bagi mereka yang melihat detail dari pesan [diagnostik], adalah berita bagi orang bebal ini bahwa ada sebuah konvensi di kota di mana semua 6.xversi, secara internal Assembly Version 6.0.0.0, yaitu hanya komponen SemVer Mayor yang masuk ke dalam Majelis Versi :)

Ruben Bartelink
sumber
3
Terima kasih - telah menggunakan Visual Studio selama bertahun-tahun dan tidak pernah punya masalah yang perlu menggali dalam log build ini. Masalah yang berbeda tetapi menyadari bahwa informasi yang saya cari sedang dipancarkan di suatu tempat menyelesaikan masalah saya.
Timothy Lee Russell
4
Detail level log tampaknya berfungsi di dalam VS (jadi tidak diperlukan diagnostik). Tidak akan menjadi yang pertama kali bahwa MSBuild berperilaku berbeda di dalam VS ....
Johannes Rudolph
105
Untuk mengubah verbositas log dari menu Tools-> Options, lalu cari Project and Solutions-> Build and Run
Jenn
3
Dalam kasus saya, saya memiliki tiga konflik dan salah satunya bertanggung jawab atas dua lainnya. Saya menyalin log build "terperinci" ke Notepad, mencari "konflik", memperbarui paket NuGet untuk referensi yang saya kenali, dan masalahnya terpecahkan.
Isaac Lyman
@robotnik Terima kasih atas saran edit [yang ditolak oleh orang lain]. Sebenarnya saya sudah memasukkan info di bagian bawah jawaban tetapi mudah-mudahan jawabannya seperti sekarang sejelas yang Anda maksudkan.
Ruben Bartelink
76

Jalankan msbuild Foo.sln /t:Rebuild /v:diag(dari C:\Program Files (x86)\MSBuild\12.0\bin) untuk membangun solusi Anda dari baris perintah dan dapatkan sedikit lebih detail, kemudian temukan .csproj.yang mencatat peringatan dan periksa referensi dan referensi proyek lainnya yang menggunakan perakitan umum yang sama yang berbeda dalam versi.

Sunting: Anda juga dapat mengatur verbositas build secara langsung di VS2013. Pergi ke Tools> Optionsmenu kemudian pergi ke Projects and Solutionsdan mengatur MSBuild verbosity ke Diagnostic.

Sunting: Beberapa klarifikasi karena saya sendiri punya satu. Dalam kasus saya, peringatan terjadi karena saya menambahkan referensi menggunakan prompt Resharper sebagai lawan dari dialog Add Reference, yang melakukannya tanpa versi meskipun v4 dan v12 tersedia untuk dipilih.

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework" />

vs.

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework, Version=12.0.0.0, ..." />

Dalam log MSBuild dengan /v:diagverbosity tampak seperti berikut. memberikan detail yang dua rujukan bertentangan: -

  There was a conflict between 
  "Microsoft.Build.Framework, Version=4.0.0.0, ..." and 
  "Microsoft.Build.Framework, Version=12.0.0.0, ...". (TaskId:16)

      "Microsoft.Build.Framework, Version=4.0.0.0, ..." was chosen because it was primary and 
      "Microsoft.Build.Framework, Version=12.0.0.0, ..." was not. (TaskId:16)

      References which depend on "Microsoft.Build.Framework, Version=4.0.0.0, ..." 
      [C:\...\v4.5.1\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v4.5.1\Microsoft.Build.Framework.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v4.5.1\Microsoft.Build.Framework.dll". (TaskId:16)
              Microsoft.Build.Framework (TaskId:16)

      References which depend on "Microsoft.Build.Framework, Version=12.0.0.0, ..." 
      [C:\...\v12.0\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v12.0\Microsoft.Build.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v12.0\Microsoft.Build.dll". (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

          C:\...\v12.0\Microsoft.Build.Engine.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v12.0\Microsoft.Build.Engine.dll". (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3277: 
Found conflicts between different versions of the same dependent assembly that could not be resolved.  
These reference conflicts are listed in the build log when log verbosity is set to detailed. 
[C:\Users\Ilya.Kozhevnikov\Dropbox\BuildTree\BuildTree\BuildTree.csproj]
Ilya Kozhevnikov
sumber
10
Saya akhirnya msbuild "Foo.sln" /t:Rebuild /v:d > build.log
mem
2
Cara terbaik untuk sampai ke terminal untuk ini: stackoverflow.com/a/22702405/268066
CrazyPyro
@CrazyPyro msbuild memiliki pipa "built in" - /l:FileLogger,Microsoft.Build.Engine;logfile=build.log- perhatikan sakelar untuk penjelasan penebang di sini
drzaus
3
Di mana "build log" berada? Bagaimana saya menemukannya?
Tahanan ZERO
Jawaban ini menunjukkan cara mendapatkan detail lebih banyak dari msbuild, yang merupakan perhatian pengguna mono. Semua jawaban lain menganggap Anda menggunakan VS dan berjalan di lingkungan Windows.
UnconditionalReinstateMonica
39

Saya hanya dapat mendukung jawaban Ruben lebih lanjut dengan perbandingan antara dua pesan yang ditampilkan:

masukkan deskripsi gambar di sini

dan pesannya:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): peringatan MSB3277: Ditemukan konflik antara versi berbeda dari rakitan dependen yang sama yang tidak dapat diselesaikan. Konflik referensi ini tercantum dalam log bangunan ketika verbositas log diatur ke detail .

Jadi, Ruben benar — ini tidak benar. Tidak ada konflik apa pun, hanya majelis yang hilang. Ini sangat membosankan ketika proyek ini adalah aplikasi ASP.NET, karena pandangan dikompilasi sesuai permintaan , yaitu, sebelum ditampilkan untuk pertama kalinya. Inilah saatnya menjadi perlu untuk memiliki majelis tersedia. (Ada opsi untuk melakukan pre-kompilasi pandangan bersama-sama dengan sisa kode, tapi ini cerita lain .) Di sisi lain, jika Anda mengatur verbosity ke Diagnostic Anda mendapatkan output berikut:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): peringatan MSB3245: tidak dapat menyelesaikan referensi ini. Tidak dapat menemukan lokasi perakitan "System.Web.Razor, Versi = 3.0.0.0, Culture = netral, PublicKeyToken = 31bf3856ad364e35, processorArchitecture = MSIL". Periksa untuk memastikan rakitan ada pada disk. Jika referensi ini diperlukan oleh kode Anda, Anda mungkin mendapatkan kesalahan kompilasi.

Akibatnya, yang perlu Anda lakukan adalah:

  1. Tambahkan referensi ke rakitan secara manual (temukan di disk, mungkin GAC, dan tambahkan sebagai referensi "langsung"), atau
  2. Gunakan paket NuGet (jika dipublikasikan di galeri) untuk mengunduhnya dan merujuk rakitan yang terkandung di dalamnya.

Lebih lanjut tentang galeri NuGet di sini . Lebih lanjut tentang mengkompilasi pandangan ASP.NET di sini .

Alexander Christov
sumber
Di VS 2017, ketika saya mengatur "proyek MSBuild membangun output verbosity" (bukan file log) ke Detail (bukan Diagnostic), saya mendapatkan kesalahan "Tidak dapat menemukan perakitan" di jendela Output saya.
ALEXintlsos
@ALEXintlsos: rupanya fungsi ini telah berubah; masih ada kesalahan di mana pun Anda berada - ikuti instruksi untuk menghilangkannya.
Alexander Christov
22

Mengubah verbosity build di studio visual akan membantu untuk menunjuk ke arah yang benar. Ikuti langkah-langkah di bawah ini untuk mengubah verbositas di VS

  1. Buka menu Tools-> Options di VS
  2. Buka Proyek dan Solusi-> Bangun dan Jalankan
  3. Ubah nilai proyek MSBuild build verbosity output. Pilih satu dari Quiet, Minimal, Normal, DetaileddanDiagnostic

Periksa jendela output ( Ctrl+ Alt+ O) di VS untuk melihat perubahan dalam log pembangunan.

sree
sumber
16

dan bagaimana cara membuat peringatan itu hilang?

Anda mungkin harus menginstal ulang atau meningkatkan paket NuGet Anda untuk memperbaikinya.

CrazyPyro
sumber
2
Ini, dengan kombinasi restart Visual Studio ketika menolak menginstal ulang paket dengan benar, memecahkan masalah bagi saya.
Ohad Schneider
22
Cara termudah untuk memeriksa: Klik kanan pada solusi -> Manage NuGet packages for solution-> Di bawah ConsolidateAnda dapat melihat apakah ada versi berbeda dari paket yang sama telah diinstal
elshev
16

Mengulangi salah satu komentar dari @elshev Klik kanan pada solusi -> Kelola paket NuGet untuk solusi -> Di bawah Konsolidasi, Anda dapat melihat apakah ada versi berbeda dari paket yang sama diinstal. Perbarui paket di sana. Kesalahan konflik diselesaikan.

Shaswat Rungta
sumber
1
ini tidak menyelesaikan untuk saya. Saya harus menghapus Newtonsoft.JSON dan menginstal ulang melalui NuGet. Ini memperbarui dependensi pada paket lain.
Garr Godfrey
Ini juga terjadi pada saya ketika menggunakan alat seperti Resharper, yang secara otomatis menambahkan referensi DLL yang hilang. "Selalu tambahkan menggunakan nuget" bisa menjadi saran yang bagus di sini.
Shaswat Rungta
Ini tidak berfungsi untuk saya karena untuk menghapus paket, ia mencoba membangun yang tidak dapat terjadi karena ada konflik paket. Jadi saya bahkan tidak bisa menginstal ulang paket :(
nickornotto
8

Saya menggunakan Visual Studio 2017 dan menemukan ini ketika saya memperbarui beberapa paket Nuget. Apa yang berhasil bagi saya adalah membuka web.configfile saya dan menemukan <runtime><assemblyBinding>node dan menghapusnya. Simpan web.configdan bangun kembali proyek.

Lihatlah Error Listjendelanya. Anda akan melihat apa yang tampak seperti peringatan panjang tentang konflik yang mengikat. Klik dua kali dan itu akan secara otomatis membuat ulang <runtime><assemblyBinding>blok dengan pemetaan yang benar.

RandomHandle
sumber
6

Sebagaimana dinyatakan dalam masalah dotnet CLI 6583 masalah ini harus diselesaikan dengan dotnet nuget locals --clear allperintah.

Jose L. Garcia
sumber
1
Ini tidak berhasil untuk saya; situasinya sama setelah menjalankan perintah.
Zimano
3

Saya bisa menyelesaikan ini menginstal Newtonsoft Json di proyek web dengan paket nugget

Carolina
sumber
3

Jelas ada banyak penyebab berbeda dan dengan demikian banyak solusi untuk masalah ini. Untuk memasukkan tambang ke dalam campuran, kami memutakhirkan sebuah perakitan (System.Net.Http) yang sebelumnya secara langsung direferensikan dalam proyek Web kami ke versi yang dikelola oleh NuGet. Ini menghapus referensi langsung dalam proyek itu, tetapi proyek Uji kami masih berisi referensi langsung. Memutakhirkan kedua proyek untuk menggunakan perakitan yang dikelola NuGet menyelesaikan masalah.

joelmdev
sumber
2

Jika Anda melakukan perubahan pada paket - buka kembali sln. Ini berhasil untuk saya!

Naumaan Shaikh
sumber
1

Saya menemukan bahwa, kadang-kadang, paket nuget akan menginstal (apa yang saya duga). NET Core memerlukan komponen atau item lain yang bertentangan dengan kerangka kerja yang sudah diinstal. Solusi saya di sana adalah membuka file project (.csproj) dan menghapus referensi tersebut. Misalnya, System.IO, System.Threading dan semacamnya, cenderung ditambahkan ketika Microsoft.Bcl disertakan melalui beberapa paket NuGet yang baru diinstal. Tidak ada alasan untuk versi spesifik dari mereka di proyek saya, jadi saya menghapus referensi dan membangun proyek. Semoga itu bisa membantu.

Anda dapat mencari "referensi" file proyek Anda dan menghapus konflik. Jika mereka termasuk dalam Sistem, singkirkan mereka, dan build seharusnya bekerja. Ini mungkin tidak menjawab semua kasus masalah ini - saya memastikan Anda tahu apa yang berhasil untuk saya :)

Contoh dari apa yang saya komentari:

<!-- <Reference Include="System.Runtime, Version=2.6.9.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> -->
  <!-- <HintPath>$(SolutionDir)packages\Microsoft.Bcl.1.1.9\lib\net40\System.Runtime.dll</HintPath> -->
  <!-- <Private>True</Private> -->
<!-- </Reference> -->

Auri Rahimzadeh
sumber
1

Saya mengikuti saran dari beberapa tanggapan di sini untuk mencari tahu apa yang salah, tetapi tidak ada jawaban yang menjelaskan cara memperbaikinya. Masalah saya adalah bahwa satu referensi memerlukan versi yang berbeda dari referensi kedua. Jadi Newtonsoft berada di versi 6, tetapi beberapa DLL lain menginginkan 4,5. Kemudian saya memutakhirkan Newtonsoft sebagai salah satu jawaban lain yang disarankan dan itu membuat segalanya menjadi lebih buruk.

Jadi saya benar-benar menurunkan instal Newtonsoft saya dan peringatan itu hilang (VS 2017):

Klik kanan Referensi di penjelajah solusi dan pilih Kelola Paket NuGet ... Di bawah tab "Diinstal", cari Newtonsoft (atau apa pun konflik Anda) versi. Tidak jelas bagi saya bahwa dropdown ini dapat digunakan untuk menurunkan versi.

Andrew
sumber
1

Anda bisa menjalankan Dotnet CLI dengan kata kerja diagnostik penuh untuk membantu menemukan masalah.

dotnet run --verbosity diagnostic >> full_build.log

Setelah build selesai Anda dapat mencari melalui file log (full_build.log) untuk kesalahan tersebut. Mencari "konflik" misalnya, seharusnya membawa Anda langsung ke masalah.

Pangeran Owen
sumber
0

Saya telah menghapus instalan Microsoft ASP.NET MVC nuget.org dari mengelola NuGet Packagaes dan menginstalnya kembali. Saat menginstal ulang itu menyelesaikan semua konflik yang terkait dengan versi pisau cukur. Cobalah .

jitendra r
sumber
0

Saya mengubah verbositas MSBuild ke Diagnostic.but tidak bisa menemukan di mana masalahnya jadi menurut jawaban di atas saya memiliki kode ini di app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="XbimXplorer.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>

Jadi saya baru saja mengubah Sistem pertama, Versi dari 4.0.0.0 ke 12.0.0.0 dan proyek saya berhasil.

Pantelitsa Mavrovounioti
sumber
0

Seperti jawaban lainnya, atur level pencatatan output ke detail dan cari konflik di sana, yang akan memberi tahu Anda ke mana harus mencari berikutnya.

Dalam kasus saya, itu mengirim saya ke beberapa arah mencari sumber referensi, tetapi pada akhirnya ternyata masalahnya adalah salah satu proyek perpustakaan kelas portabel saya, itu menargetkan versi yang salah dan menarik sendiri versi referensi, maka konflik. Target ulang cepat dan masalahnya selesai.

car1bo
sumber
0

Saya hanya mengalami ini dan masalah setelah beralih paket dari nuget ke dll yang dirujuk secara lokal. Masalahnya adalah runtime binding stuff yang lama di app.config.

Tom Makin
sumber
0

Saya mendapat peringatan ini setelah bermigrasi ke Referensi Paket. Dalam hasil diagnostik ada informasi bahwa perpustakaan dirujuk oleh perpustakaan yang sama itu sendiri. Ini mungkin bug dari Paket Referensi baru. Solusinya adalah mengaktifkan AutoGenerateBindingRedirects dan menghapus pengarahan ulang pengikatan khusus.

raV720
sumber
0

VS 2017, proyek MVC

Saya tidak tahu mengapa, tetapi bagi saya, solusi untuk masalah ini adalah menghapus outparameter dari tanda tangan metode model yang dipanggil dari metode aksi pengontrol. itu perilaku yang sangat aneh tapi itu solusi untuk masalah saya.

Jonathana
sumber
-2

Lari Update-Package perintah melalui Package Manager Console

Ini akan memperbaiki MSB3277, apa fungsinya menginstal ulang semua paket dan semua rakitan terkait yang disertai dengan versi setinggi mungkin . Juga dimungkinkan untuk memperbarui paket tertentu saja. Atau downgrade setelah pembaruan jika ingin, masalah ini diperbaiki untuk saya beberapa kali muncul. Bergantung pada berapa banyak paket nuget yang Anda miliki, proses ini mungkin memakan waktu beberapa menit.

Info lebih lanjut tentang dokumen resmi https://docs.microsoft.com/en-us/nuget/consume-packages/reinstalling-and-updating-packages

Aistis Taraskevicius
sumber
14
Saran ini dapat merusak hari Anda jika Anda tidak menginginkan paket terbaru yang sering kali menjadi kasus kode produksi.
Tony O'Hagan
1
Ini ditunjukkan dalam saran dan apa yang mungkin menjadi masalah bagi Anda, adalah cara yang aman dan mudah untuk memperbaiki masalah, jadi tolong jangan turun memilih orang berdasarkan pendapat Anda sendiri.
Aistis Taraskevicius
1
Solusi ini tidak berhasil untuk saya. Saya sudah memiliki semua versi terbaru.
Zero3
@ Zero3 apakah Anda menjalankannya dari solusi teratas Anda, tanpa menentukan paket apa pun secara langsung, biasanya berfungsi, karena ia menginstal ulang setiap paket dan memperbarui referensi, yang merupakan penyebab kesalahan pencocokan
Aistis Taraskevicius
3
Ini saran yang sangat mengerikan. Itu bukan pendapat, memperbarui paket merusak kode jika tidak dilakukan dengan niat.
TheBatman