Saya mencoba menjalankan beberapa tes unit dalam aplikasi C # Windows Forms (Visual Studio 2005), dan saya mendapatkan kesalahan berikut:
System.IO.FileLoadException: Tidak dapat memuat Utilitas file atau rakitan, Versi = 1.2.0.200, Budaya = netral, PublicKeyToken = 764d581291d764f7 'atau salah satu dari ketergantungannya. Definisi manifes rakitan yang ditemukan tidak cocok dengan rujukan rakitan. (Pengecualian dari HRESULT: 0x80131040) **
di x.Foo.FooGO ()
di x.Foo.Foo2 (String groupName_) di Foo.cs: baris 123
di x.Foo.UnitTests.FooTests.TestFoo () di FooTests.cs: baris 98 **
System.IO.FileLoadException: Tidak dapat memuat Utilitas file atau rakitan, Versi = 1.2.0.203, Budaya = netral, PublicKeyToken = 764d581291d764f7 'atau salah satu dari ketergantungannya. Definisi manifes rakitan yang ditemukan tidak cocok dengan rujukan rakitan. (Pengecualian dari HRESULT: 0x80131040)
Saya melihat referensi saya, dan saya hanya punya referensi Utility version 1.2.0.203
(yang lain sudah tua).
Adakah saran tentang bagaimana saya mencari tahu apa yang mencoba merujuk versi lama dari file DLL ini?
Selain itu, saya tidak berpikir saya memiliki perakitan lama ini di hard drive saya. Apakah ada alat untuk mencari rakitan versi lama ini?
Jawaban:
Loader .NET Assembly:
Majelis ini tidak cocok dengan yang diminta dan karena itu Anda mendapatkan kesalahan ini.
Dengan kata sederhana, itu tidak dapat menemukan kumpulan yang direferensikan. Pastikan ia dapat menemukan perakitan yang tepat dengan meletakkannya di GAC atau di jalur aplikasi. Juga lihat https://docs.microsoft.com/archive/blogs/junfeng/the-located-assemblys-manifest-definition-with-name-xxx-dll-does-not-match-the-assembly-reference .
sumber
Anda dapat melakukan beberapa hal untuk memecahkan masalah ini. Pertama, gunakan pencarian file Windows untuk mencari hard drive Anda untuk perakitan Anda (.dll). Setelah Anda memiliki daftar hasil, lakukan View-> Choose Details ... dan kemudian periksa "Versi File". Ini akan menampilkan nomor versi dalam daftar hasil, sehingga Anda dapat melihat dari mana versi lama itu berasal.
Juga, seperti yang dikatakan Lars, periksa GAC ββAnda untuk melihat versi apa yang terdaftar di sana. Artikel Microsoft ini menyatakan bahwa rakitan yang ditemukan di GAC tidak disalin secara lokal selama proses pembuatan, jadi Anda mungkin perlu menghapus versi lama sebelum melakukan membangun kembali semua. (Lihat jawaban saya untuk pertanyaan ini untuk catatan tentang cara membuat file batch untuk melakukan ini untuk Anda)
Jika Anda masih tidak dapat mengetahui dari mana versi lama berasal, Anda dapat menggunakan aplikasi fuslogvw.exe yang disertakan bersama Visual Studio untuk mendapatkan informasi lebih lanjut tentang kegagalan pengikatan. Microsoft memiliki informasi tentang alat ini di sini . Perhatikan bahwa Anda harus mengaktifkan pencatatan dengan mengatur
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog
kunci registri ke 1.sumber
Saya sendiri mengalami masalah ini, dan saya menemukan bahwa masalahnya adalah sesuatu yang berbeda dari apa yang telah dialami orang lain.
Saya punya dua DLL yang menjadi referensi proyek utama saya: CompanyClasses.dll dan CompanyControls.dll. Saya mendapatkan kesalahan run-time dengan mengatakan:
Masalahnya adalah, saya tidak memiliki file CompanyClasses.dll di sistem saya dengan nomor versi 1.4.1. Tidak ada di GAC, tidak ada di folder aplikasi ... tidak ada di mana pun. Saya mencari seluruh hard drive saya. Semua file CompanyClasses.dll yang saya miliki adalah 1.4.2.
Masalah sebenarnya, saya temukan, adalah bahwa CompanyControls.dll mereferensikan versi 1.4.1 dari CompanyClasses.dll. Saya baru saja mengkompilasi ulang CompanyControls.dll (setelah itu referensi CompanyClasses.dll 1.4.2) dan kesalahan ini hilang untuk saya.
sumber
CompanyControls
proyek, klik kananCompanyClasses.dll
referensi -> properti ->SpecificVersion = false
SpecificVersion = false
sendirian tidak akan memotongnya. Anda akan membutuhkanbindingredirect
.Berikut ini mengarahkan ulang setiap versi perakitan ke versi 3.1.0.0. Kami memiliki skrip yang akan selalu memperbarui referensi ini di App.config sehingga kami tidak perlu lagi berurusan dengan masalah ini.
Melalui refleksi, Anda dapat memperoleh perakitan publicKeyToken dan menghasilkan blok ini dari file .dll itu sendiri.
Perhatikan bahwa tanpa atribut namespace XML (xmlns) ini tidak akan berfungsi.
sumber
Jika Anda menggunakan Visual Studio, coba "solusi bersih" dan kemudian bangun kembali proyek Anda.
sumber
bin
danobj
melakukannya. Pada dasarnya, sesuatu yang saya gunakan untuk referensi masih duduk di sana berusaha memenuhi persyaratan yang sama. Misalnya, versi lama menjadi sesuatu yang saya referensikan langsung dan versi baru ada di NuGet.bin
folder. Anehnya, saya mencoba solusi bersih dan membangun kembali solusi sebelumnya tanpa hasil. Terkadang agak aneh.Jawaban lain tidak akan berhasil untuk saya. Jika Anda tidak peduli tentang versi dan Anda hanya ingin aplikasi Anda berjalan maka klik kanan pada referensi dan set 'versi spesifik' ke false ... Ini bekerja untuk saya.
sumber
Saya baru saja menemukan masalah ini dan masalahnya adalah saya memiliki salinan lama .dll di direktori debug aplikasi saya. Anda mungkin ingin juga memeriksa di sana (bukan GAC) untuk melihat apakah Anda melihatnya.
sumber
Saya akan meledakkan pikiran semua orang sekarang. . .
Hapus semua
<assemblyBinding>
referensi dari file .config Anda, dan kemudian jalankan perintah ini dari konsol NuGet Package Manager:sumber
Saya menambahkan paket NuGet, hanya untuk menyadari sebagian kotak hitam dari aplikasi saya merujuk ke versi perpustakaan yang lebih lama.
Saya menghapus paket dan merujuk file DLL statis versi yang lebih lama, tetapi file web.config tidak pernah diperbarui dari:
apa yang seharusnya dikembalikan ketika saya menghapus paket:
sumber
Dalam kasus saya, kesalahan ini terjadi saat menjalankan aplikasi ASP.NET. Solusinya adalah:
obj
danbin
folder di folder proyekBersih tidak bekerja, membangun kembali tidak bekerja, semua referensi baik-baik saja, tetapi itu tidak menulis salah satu perpustakaan. Setelah menghapus direktori itu, semuanya berjalan dengan sempurna.
sumber
Dalam kasus saya itu adalah versi lama dari DLL di C: \ WINDOWS \ Microsoft.NET \ Framework \ ~ \ Temporary ASP.NET Files \ direktori. Anda dapat menghapus atau mengganti versi lama, atau Anda dapat menghapus dan menambahkan kembali referensi ke DLL di proyek Anda. Pada dasarnya, cara mana pun akan membuat pointer baru ke File ASP.NET sementara.
sumber
Bagi kami, masalahnya disebabkan oleh sesuatu yang lain. File lisensi untuk komponen DevExpress termasuk dua baris, satu untuk versi lama dari komponen yang tidak diinstal pada komputer khusus ini. Menghapus versi yang lebih lama dari file lisensi memecahkan masalah.
Bagian yang mengganggu adalah bahwa pesan kesalahan tidak memberikan indikasi referensi apa yang menyebabkan masalah.
sumber
Kesalahan yang sama persis ini dilemparkan jika Anda mencoba untuk terlambat mengikat menggunakan refleksi, jika rakitan Anda mengikat untuk diberi nama kuat atau memiliki token kunci publik berubah. Kesalahannya sama meskipun sebenarnya tidak ada rakitan yang ditemukan dengan token kunci publik yang ditentukan.
Anda perlu menambahkan token kunci publik yang benar (Anda bisa mendapatkannya menggunakan sn -T di dll) untuk menyelesaikan kesalahan. Semoga ini membantu.
sumber
Milik saya adalah situasi yang sangat mirip dengan posting oleh Nathan Bedford tetapi dengan sedikit twist. Proyek saya juga mereferensikan dll yang diubah dalam dua cara. 1) Secara Langsung dan 2) Secara Tidak Langsung dengan mereferensikan komponen (pustaka kelas) yang memiliki referensi ke dll yang diubah. Sekarang proyek Visual studio saya untuk komponen (2) mereferensikan versi yang benar dari dll yang diubah. Namun nomor versi dari kompnen itu sendiri TIDAK diubah. Dan sebagai hasilnya, pemasangan versi baru proyek gagal untuk mengganti komponen itu pada mesin klien.
Hasil akhir: Referensi langsung (1) dan referensi tidak langsung (2) menunjuk ke berbagai versi dll yang diubah di mesin klien. Di mesin dev saya bekerja dengan baik.
Resolusi: Hapus aplikasi; Hapus semua DLLS dari folder aplikasi; Instal ulang. Sederhana seperti dalam kasus saya.
sumber
Saya akan membiarkan seseorang mendapat manfaat dari kebodohan geser saya. Saya memiliki beberapa dependensi untuk aplikasi yang sepenuhnya terpisah (sebut saja App1 ini). Dll dari App1 ditarik ke aplikasi baru saya (App2). Setiap kali saya melakukan pembaruan di APP1, saya harus membuat dll baru dan menyalinnya ke App2. Baik. . . Saya bosan menyalin dan menempel antara 2 versi App1 yang berbeda, jadi saya hanya menambahkan awalan 'NEW_' ke dll.
Baik. . . Saya menduga bahwa proses pembangunan memindai folder / bin dan ketika itu cocok dengan sesuatu yang salah, itu muntah dengan pesan kesalahan yang sama seperti disebutkan di atas. Saya menghapus versi "new_" saya dan itu dibuat sangat bagus.
sumber
Masalah saya adalah menyalin kode sumber ke mesin baru tanpa menghentikan rakitan yang dirujuk.
Tidak ada yang saya perbaiki kesalahannya, jadi dengan tergesa-gesa, saya menghapus direktori BIN sama sekali. Bangun kembali kode sumber saya, dan itu bekerja sejak saat itu.
sumber
Saya hanya ingin menambahkan bahwa saya sedang membuat proyek ASP.NET MVC 4 dasar dan menambahkan DotNetOpenAuth.AspNet via NuGet. Ini menghasilkan kesalahan yang sama setelah saya mereferensikan file DLL yang tidak cocok untuk Microsoft.Web.WebPages.OAuth.
Untuk memperbaikinya saya melakukan
Update-Package
dan membersihkan solusi untuk membangun kembali penuh.Itu bekerja untuk saya dan agak malas, tetapi waktu adalah uang :-P
sumber
Update-Package -reinstall
instal ulang semua paket NuGet pada versi yang sama.Saya mendapatkan kesalahan ini ketika membangun di build-service Team Foundation Server. Ternyata saya punya beberapa proyek dalam solusi saya menggunakan versi berbeda dari perpustakaan yang sama ditambahkan dengan NuGet. Saya menghapus semua versi lama dengan NuGet dan menambahkan yang baru sebagai referensi untuk semua.
Team Foundation Server menempatkan semua file DLL dalam satu direktori, dan hanya ada satu file DLL dari nama tertentu pada saat yang bersamaan.
sumber
App.config saya berisi a
untuk npgsql. Entah bagaimana di mesin pengguna, app.exe.config saya hilang. Saya tidak yakin apakah itu pengguna konyol, penginstal kesalahan, atau anti-virus yang belum. Mengganti file memecahkan masalah.
sumber
Saya baru saja menemukan alasan lain mengapa mendapatkan kesalahan ini. Saya membersihkan GAC saya dari semua versi perpustakaan tertentu dan membangun proyek saya dengan referensi ke versi spesifik yang digunakan bersama dengan executable. Ketika saya menjalankan proyek saya mendapat pengecualian ini mencari versi perpustakaan yang lebih baru.
Alasannya adalah kebijakan penerbit . Ketika saya mencopot versi perpustakaan dari GAC, saya lupa mencopot rakitan kebijakan penerbit juga, jadi alih-alih menggunakan perakitan yang dikerahkan secara lokal, loader perakitan menemukan kebijakan penerbit di GAC yang menyuruhnya mencari versi yang lebih baru.
sumber
Bagi saya konfigurasi cakupan kode dalam file "Local.testtesttings" "menyebabkan" masalah. Saya lupa memperbarui file yang direferensikan di sana.
sumber
Hanya menghapus isi folder bin proyek Anda dan membangun kembali solusi menyelesaikan masalah saya.
sumber
bersihkan dan bangun kembali solusi mungkin tidak menggantikan semua dll dari direktori keluaran.
apa yang akan saya sarankan adalah mencoba mengubah nama folder dari "bin" menjadi "oldbin" atau "obj" menjadi "oldobj"
dan kemudian coba bangun kembali kesunyian Anda.
memeteraikan jika Anda menggunakan dll pihak ketiga yang Anda perlu menyalin ke folder "bin" atau "obj" yang baru dibuat setelah berhasil membangun.
Saya harap ini akan bekerja untuk Anda.
sumber
Menghapus majelis lama dari lokasi folder secara manual dan kemudian menambahkan referensi ke majelis baru mungkin membantu.
sumber
Saya mendapatkan kesalahan yang sama ... Dalam kasus saya, masalah ini diselesaikan sebagai berikut:
sumber
Inilah metode saya untuk memperbaiki masalah ini.
Oke, jadi dalam contoh ini, .dll saya pasti 2.0.5022.0 (jadi nomor versi Exception salah).
Jadi, dalam contoh ini, saya akan mengganti ini ...
... dengan ini...
Pekerjaan selesai !
sumber
Dalam kasus saya masalahnya ada di antara kursi dan keyboard :-)
Dua atau lebih majelis yang berbeda ingin menggunakan versi berbeda dari perpustakaan DotNetOpenAuth, dan itu tidak akan menjadi masalah. Selanjutnya, di komputer lokal saya web.config secara otomatis diperbarui oleh NuGet:
Kemudian saya menyadari bahwa saya lupa menyalin / menggunakan web.config baru ke server produksi. Jadi, jika Anda memiliki cara manual untuk menyebarkan web.config, periksa apakah sudah diperbarui. Jika Anda memiliki web.config yang sama sekali berbeda untuk server produksi, Anda harus menggabungkan bagian dependAssembly ini dalam sinkronisasi setelah menggunakan NuGet.
sumber
Jika Anda pernah mendapatkan kesalahan seperti " Definisi manifes perakitan yang ditemukan tidak cocok dengan referensi perakitan " dan jika Anda telah memperbarui melalui Project> Kelola Paket NuGet dan Perbarui tab di VS , hal pertama yang dapat Anda lakukan adalah mencoba menginstal versi lain dari paket setelah memeriksa versi dari halaman Galeri NuGet dan menjalankan perintah berikut dari Package Manager Console:
Meskipun jawaban tidak secara langsung terkait dengan paket yang dimaksud dan itu ditanyakan kembali, itu agak umum, masih relevan dan berharap itu membantu seseorang.
sumber
Tidak ada solusi yang berfungsi untuk saya. Saya mencoba membersihkan solusi proyek, menghapus bin, memperbarui paket, menurunkan paket dan sebagainya ... Setelah dua jam saya memuat App.config default dari proyek dengan rakitan dan di sana saya mengubah versi referensi yang salah dari:
untuk:
Setelah ini saya membersihkan proyek, membangunnya lagi dan berhasil. Tidak ada peringatan, tidak ada masalah.
sumber
Saya menerima pesan kesalahan ini karena mereferensikan sebuah majelis yang memiliki nama yang sama dengan majelis yang saya bangun.
Ini dikompilasi tetapi menimpa rakitan yang direferensikan dengan rakitan proyek saat ini - sehingga menyebabkan kesalahan.
Untuk memperbaikinya saya mengubah nama proyek, dan properti perakitan tersedia melalui mengklik kanan pada proyek dan memilih 'Properti'.
sumber