.Net memilih versi perakitan yang dirujuk salah

141

Saya baru saja menyalin proyek yang ada ke mesin baru untuk mulai mengembangkannya dan mengalami masalah dengan versi salah satu rakitan yang saya referensikan (DLL telerik saat itu terjadi).

Proyek awalnya mereferensikan versi perakitan yang lebih lama (sebut saja v1.0.0.0). Mesin baru saya memiliki versi perakitan terbaru yang diinstal, jadi saya pikir saya akan memperbaruinya (sebut saja versi baru v2.0.0.0).

Sekarang inilah masalahnya: Jika saya menyalin dll v1.0.0.0 lama ke folder proyek dan menambahkannya sebagai referensi, situs web diluncurkan tanpa masalah. Jika saya menghapus referensi itu (dan juga menghapus DLL lama dari sistem saya) dan menambahkan versi baru (v2.0.0.0), halaman menunjukkan pengecualian berikut:

Tidak dapat memuat file atau rakitan 'XXXXXX, Versi = 1.0.0.0, Budaya = netral, PublicKeyToken = 121fae78165ba3d4' atau salah satu dari ketergantungannya. Definisi manifes rakitan yang ditemukan tidak cocok dengan rujukan rakitan. (Pengecualian dari HRESULT: 0x80131040)

Jelas, kodenya mencari versi yang ketinggalan zaman dan tidak dapat menemukannya. Tapi kenapa?

Saya menerima folder solusi untuk nomor versi itu dan tidak dapat menemukan satu referensi pun. Saya memeriksa teks dari file .csproj dan menemukan versi yang benar menunjukkan versi terbaru dan HintPath dengan benar menunjukkan jalan ke DLL baru. Selain itu, karena saya tidak menginstal DLL lama pada sistem, itu tidak muncul di GAC saya (meskipun v2.0.0.0 tidak, seperti yang diharapkan).

Saya kemudian mengaktifkan fusion log viewer untuk mencoba mencari tahu mengapa ia mencari versi lama itu, tetapi tidak berhasil:

Assembly Load Trace: The following information can be helpful to determine why the assembly 'XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4' could not be loaded.


=== Pre-bind state information ===
LOG: User = MyComp\me
LOG: DisplayName = XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
 (Fully-specified)
LOG: Appbase = file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/
LOG: Initial PrivatePath = d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\bin
Calling assembly : WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\web.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX/XXXXXX.DLL.
LOG: Attempting download of new URL file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin/XXXXXX.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Semua itu mengatakan bahwa itu dimulai dengan mencari majelis lama itu. Saya telah mencoba untuk menemukan solusi online dan melihat pertanyaan SO yang serupa ini , tetapi tampaknya kebalikan dari masalah saya. Program kuesioner itu menemukan DLL yang salah, bukan yang direferensikan. Sedangkan masalah saya adalah bahwa program ini secara misterius mencari DLL yang salah dan tidak dapat menemukannya ketika yang tepat dapat ditemukan secara lokal di folder bin dan di GAC.

Mengapa saya mencari versi lama? Di mana lagi saya dapat mencari untuk menemukan referensi yang buruk ini?

Michael La Voie
sumber

Jawaban:

151

Dugaan saya adalah bahwa rakitan lain yang Anda gunakan adalah referensi dll lama. Apakah Anda terbiasa dengan semua referensi proyek lain yang digunakan dan apakah ada di antara mereka yang memiliki referensi ke dll Telerik?

Bisakah Anda memasukkan pengalihan yang mengikat di file web.config Anda seperti ini?

<dependentAssembly>
 <assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/>
 <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
Chris Conway
sumber
12
Saya memiliki semua jenis masalah yang mirip dengan ini dengan berbagai versi memuat / tidak memuat. Trik lain yang dapat Anda coba adalah menghapus semua file secara manual di folder C: /WINDOWS/Microsoft.NET/Framework/v4.0.30319/T ASP.NET sementara / file root / 90233b18 / 10d54998. Kadang-kadang ketika mengkompilasi ulang situs web, ASP.Net tidak membersihkan folder itu karena beberapa kunci file dan lain-lain itu mungkin bergantung pada referensi lama. Ini layak dicoba, saya tahu itu bekerja untuk saya di masa lalu.
Chris Conway
1
Anda memecahkan masalah terkait untuk saya - terima kasih! Formulir yang diwarisi dalam aplikasi C # saya tidak akan terbuka di perancang karena sedang mencari versi referensi lama. Ternyata referensi lain pada awalnya dibuat saat referensi versi lama dari referensi masalah.
Sam Skuce
2
Jika Anda berkeliaran tentang sintaks: msdn.microsoft.com/en-us/library/0ash1ksb.aspx
Junior Mayhé
1
Terimakasih Chris! Anda memecahkan masalah saya di sini: stackoverflow.com/q/11490177/7850
Shaul Behr
3
Anda juga dapat melihat di App.config atau web.config dan melihat apakah <dependentAssembly>entri yang ada menyebabkan masalah.
Roy Tinker
24

Saya dengan Chris Conway untuk yang satu ini (dibesarkan dia). Masalahnya adalah bahwa Anda mereferensikan salah satu majelis telerik dalam proyek Anda yang mereferensikan yang lain yang tidak ada.

Hal pertama: Saya tidak akan menginstal vendor APAPUN (yaitu: telerik) ke GAC. Barang-barang Telerik dikompilasi menjadi hanya dua rakitan (telerik.web.design dan telerik.web.ui). Cukup gunakan mereka yang memiliki aplikasi.

Kedua, dalam setiap file .proj Anda (seperti .csproj) akan ada <reference include..>yang menunjuk ke file Telerik.Web.UI. Ini biasanya berisi nomor versi. Pastikan rakitan yang Anda masukkan ke folder bin cocok dengan versi itu.

Ketiga, pastikan SEMUA proyek Anda menggunakan perakitan terbaru. Juga pastikan mereka meraih perakitan dari jalur lokal, bukan GAC. (Saya benar-benar tidak suka GAC. Ini telah menyebabkan tidak ada habisnya masalah pada beberapa proyek saya sudah di). Kami biasanya memiliki folder "Sidang" yang digunakan semua proyek untuk referensi perakitan eksternal.

Keempat, visual studio secara otomatis mencari gac Anda setiap kali proyek situs web dimuat dan menargetkan ulang lokasi perakitan jika menemukan sesuatu di gac. Saya tidak ingat apakah pernah melakukan ini untuk proyek aplikasi web, tetapi saya tidak memiliki masalah dalam waktu yang lama dengan itu. Ini dapat menyebabkan masalah serupa selama penyebaran.

Kelima, Anda dapat mengubah nomor versi untuk majelis di web.config. Pada runtime/assemblybindingbagian ini Anda dapat menggunakan sesuatu seperti berikut ini yang membawa setiap perakitan telerik digunakan pada tahun 2008 ke depan dan mengarahkannya ke versi yang sangat khusus:

  <dependentAssembly>
    <assemblyIdentity name="Telerik.Web.UI" publicKeyToken="121fae78165ba3d4" />
    <bindingRedirect oldVersion="2008.0.0.0-2020.0.0.0" newVersion="2010.02.0713.35" />
  </dependentAssembly>
Bukan saya
sumber
2
Maksud saya "merasa", itu sudah mengganggu saya selama berbulan-bulan sekarang :)
Michael La Voie
21

Saya mencoba sebagian besar jawaban tetapi tetap tidak berhasil. Ini bekerja untuk saya:

klik kanan pada referensi -> properti -> ubah 'Versi Khusus' menjadi false.

masukkan deskripsi gambar di sini

Semoga ini membantu.

Tanpa Rayuan
sumber
30
Itulah arti memberi suara pada +1.
xr280xr
7
Tetapi kadang-kadang upvote sederhana tidak cukup meringkas betapa bahagianya dan lega jawabannya membuat Anda - setelah menghabiskan berjam-jam mencoba untuk memperbaiki masalah bodoh yang seharusnya tidak menjadi masalah, dan Anda mencoba googling dengan cara yang berbeda , temukan jawaban yang berbeda dari yang Anda coba sebelumnya, dan boom! itu bekerja sekarang! Setelah semua itu, kadang-kadang hanya dengan menekan tombol upvote tidak sesuai dengan perasaan yang luar biasa, Bung, Anda benar-benar menyelamatkan saya dari yang satu ini.
Michael Plautz
7

Mencoba:

  • membersihkan file proyek sementara
  • membersihkan file build dan obj
  • membersihkan versi lama yang diinstal di C:\Users\USERNAME\.nuget\packages\

Itu berhasil bagi saya.

delira
sumber
1
Membersihkan direktori C: \ Users \ USERNAME \ .nuget \ Packages \ adalah apa yang saya lewatkan. Terima kasih banyak!
Herdo
untuk versi nuget lama yang bersih, di komputer berbasis windows, ckuck Mulai dan cari "jalankan"> salin & tempel "% userprofile% \. nuget \ paket" - ini akan membuka folder versi
nuget
3
  1. Pergi ke C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG
  2. Temukan file machine.config
  3. buka di notepad
  4. menemukan dll konflik
  5. Hapus ini dan simpan.

majelis kompilasi

addassembly = dllName, Versi = 1.0.0000.0000 Budaya = netral, PublicKeyToken = "QWEWQERWETERY"

kompilasi majelis

bekerja untukku.

Reynan de la Cruz
sumber
2
Saya juga menemukan mimpi buruk ini - bahkan jika Anda menghapus perakitan dari GAC ia meninggalkan referensi versi yang salah di "C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ machine.config"
Evalds Urtans
3

Ini bukan jawaban yang jelas mengapa, tetapi kami memiliki masalah ini, inilah keadaan kami dan apa yang menyelesaikannya:

Dev 1:

Solusi berisi Project A yang mereferensikan Paket NuGet, dan proyek referensi MVC Proyek A. Diaktifkan Pemulihan Paket NuGet, kemudian memperbarui paket NuGet. Mendapat kesalahan runtime yang mengeluh lib NuGet tidak dapat ditemukan - tetapi kesalahannya adalah mencari versi yang lebih lama dan tidak diperbarui. Solusi (dan ini konyol): Tetapkan breakpoint pada baris pertama kode dalam proyek MVC yang memanggil Proyek A. Selangkah dengan F11. Dipecahkan - tidak pernah punya masalah lagi.

Dev 2:

Solusi dan proyek yang sama, tetapi set breakpoint sihir dan langkah dalam solusi tidak bekerja. Mencari di mana-mana untuk pengalihan versi atau referensi buruk lainnya untuk paket Nuget ini, menghapus paket dan menginstalnya kembali, menghapus bin, obj, Asp.Net Temp, tidak ada yang menyelesaikannya. Akhirnya, berganti nama menjadi Proyek A, menjalankan proyek MVC - diperbaiki. Mengganti nama itu kembali ke nama aslinya, tetap diperbaiki.

Saya tidak punya penjelasan mengapa itu berhasil, tapi itu membuat kami keluar dari kesulitan besar.

Chris Moschini
sumber
2

Apakah Anda memiliki proyek lain dalam solusi itu? (Mungkin proyek lain merujuk versi lama) Biasanya dalam VS, dll ketergantungan mencakup semua proyek dalam solusi.

AspNetDev
sumber
Tidak ada proyek lain dalam solusi dan tidak ada DLL referensi lain yang mereferensikan telerik. Saya hanya mereferensikan MS DLL ala System. *
Michael La Voie
2

Masalah saya adalah bahwa majelis lama berada di folder _bin_deployableAssemblies di bawah Aplikasi Web. Ini berarti majelis lama menimpa majelis GAC ketika membangun proyek.

warrickh
sumber
2

Dalam hal ini menyelamatkan orang lain 3 jam ... kasus saya agak berbeda. Kode saya menggunakan DevExpress v11.1 v11.1.4.0. Saya telah merujuk semuanya dengan benar dalam kode saya. Tapi .net memory profiler menginstal DevExpress v11.1 v11.1.12.0 di GAC. Sebenarnya bukan komponen yang saya rujuk tetapi yang mereka rujuk secara internal yang gagal. Cobalah sekuat tenaga, GAC selalu diperiksa terlebih dahulu. Itu dikompilasi dan berjalan dengan baik tetapi saya tidak bisa melihat perancang bentuk menang dan jejak tumpukan tidak membantu sama sekali. Akhirnya dihapus profil memori .net dan semua dikembalikan.

RichieRich
sumber
2

Saya memiliki masalah serupa dan saya harus menghapus semuanya dari folder bin dan obj dan membangun kembali untuk menyelesaikan masalah saya. Semoga ini membantu.

Edd
sumber
1

Jika Anda mengalami masalah ini saat menguji dan / atau men-debug aplikasi dari lingkungan Visual Studio (ASP.NET Development Server), perlu untuk menghapus semua file sementara di folder situs web pengembangan. Untuk mengetahui di mana folder itu berada, cari ikon ASP.NET Development Server pada ikon baki Windows (seharusnya memiliki judul seperti ini: ASP.NET Development Server - Port ####), klik kanan ikon dan pilih Show Detail; Lalu, bidang jalan fisik akan memberi tahu Anda apa folder sementara itu, semua item di sana harus dihapus untuk menyelesaikan masalah. Bangun dan jalankan kembali situs web dan masalahnya harus diselesaikan (sekali lagi, dipecahkan untuk Lingkungan Pengembangan).

Gedeon
sumber
1

Saya memiliki masalah yang sama dengan majelis berbeda yang merujuk pada versi berbeda dari Newtonsoft.json. Solusi yang berhasil bagi saya adalah menjalankan pembaruan-paket dari Nuget Package Manager Console.

brando
sumber
1

Kesalahan ini agak menyesatkan - saya memuat beberapa DLL yang membutuhkan arsitektur x64 untuk ditentukan. Dalam .csprojfile:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release-ABC|AnyCPU'">
    <OutputPath>bin\Release-ABC</OutputPath>
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

Yang hilang PlatformTargetmenyebabkan kesalahan ini.

Ben
sumber
1

Saya mendapatkan:

Tidak dapat memuat file atau rakitan 'XXX-new-3.3.0.0' atau salah satu dari dependensinya. Definisi manifes rakitan yang ditemukan tidak cocok dengan rujukan rakitan. (Pengecualian dari HRESULT: 0x80131040)

Itu karena saya mengubah nama majelis dari XXX.dllmenjadi XXX-new-3.3.0.0.dll. Mengembalikan nama ke aslinya memperbaiki kesalahan.

mimo
sumber
Yap - termasuk versi dalam nama di perpustakaan perakitan umum kami untuk menghindari masalah penamaan dalam kontrol sumber. Mengubah nama kembali dan secara manual memperbarui jalur referensi / petunjuk dan semuanya bekerja.
Mathew Paxinos
0

Ini hampir seperti Anda harus menghapus komputer Anda untuk menyingkirkan dll lama. Saya sudah mencoba semuanya di atas dan kemudian saya melangkah lebih jauh dengan menghapus setiap contoh file .DLL yang ada di komputer saya dan menghapus setiap referensi dari aplikasi. Namun, itu masih mengkompilasi dengan baik dan ketika berjalan itu mereferensikan fungsi dll dengan baik. Saya mulai bertanya-tanya apakah itu merujuknya dari drive jaringan di suatu tempat.

SQLking
sumber
0

Saya memiliki pesan yang sama ketika beralih di antara dua versi aplikasi yang mereferensikan versi berbeda dari DLL yang sama. Meskipun saya menguji di folder yang berbeda, saya tidak sengaja menyalin versi yang lebih baru dari versi yang lebih lama.

Jadi, hal pertama yang harus diperiksa adalah versi DLL yang direferensikan di folder aplikasi. Untuk berjaga-jaga.

Carl Onager
sumber
0

Mungkin ini membantu atau mungkin tidak. Saya membersihkan versi debug dan rilis saya lalu mengganti nama folder OBJ. Ini akhirnya membuatku berpikir. Langkah-langkah sebelumnya pada dasarnya proyek menghapus referensi dan menambahkannya kembali di properti proyek.

Tim
sumber
0

Di My Visual Studio 2015, saya memastikan bahwa Daftar Jalur Referensi Proyek Visual Studio yang kosong kosong:

masukkan deskripsi gambar di sini

crazyTech
sumber
Anda memposting jawaban yang sama persis untuk 2 pertanyaan berbeda?
AK47
0

Inilah yang bekerja untuk saya:

Saya menggunakan Microsoft.IdentityModel.Clients.ActiveDirectoryversi 3.19 dalam proyek perpustakaan kelas tetapi hanya memiliki versi 2.22 diinstal dalam proyek Aplikasi Web ASP.NET yang sebenarnya. Memutakhirkan ke 3,19 di proyek aplikasi web membuat saya melewati kesalahan.

terang benderang
sumber
0

Dalam kasus saya, saya memiliki 3 proyek, 1 proyek utama dan 2 sub proyek yang dirujuk oleh proyek utama .. Jadi saya memperbarui proyek utama, meninggalkan sub proyek. Di situlah konflik itu. Setelah saya perbarui semua proyek saya semuanya bekerja dengan baik.

Siphamandla Hero Ngwenya
sumber
0

Dalam VS2017, telah mencoba semua solusi di atas tetapi tidak ada yang berhasil. Kami menggunakan Azure devops untuk versi.

  1. Dari tim explorer> Explorer Kontrol Sumber

masukkan deskripsi gambar di sini

  1. Pilih proyek yang membuat Anda gila untuk waktu yang lama

  2. Klik kanan cabang atau solusi> Lanjutan> dapatkan versi tertentu

masukkan deskripsi gambar di sini

  1. Kemudian pastikan Anda telah mencentang kotak centang menimpa file sesuai tangkapan layar

masukkan deskripsi gambar di sini

Ragavan Rajan
sumber
0

Dalam kasus saya, saya tidak sengaja memilih versi yang salah dari paket Telerik dari nuget, yang kemudian diganti nuget setiap paket yang saya rujuk dengan versi yang salah. Kemudian dimasukkan redirect yang mengikat ke versi yang salah sehingga bahkan setelah saya mengganti semuanya dengan versi yang benar, masih mencari versi yang salah.

Karl Dembeck
sumber