Saya punya bug yang sangat aneh di mesin uji kami. Kesalahannya adalah:
System.TypeLoadException: Method 'SetShort' in type 'DummyItem' from assembly 'ActiveViewers (...)' does not have an implementation.
Saya tidak bisa mengerti mengapa. SetShort
ada di DummyItem
kelas, dan saya bahkan telah mengkompilasi ulang sebuah versi dengan menulis ke log peristiwa hanya untuk memastikan bahwa itu bukan masalah penyebaran / versi. Yang aneh adalah bahwa kode panggilan bahkan tidak memanggil SetShort
metode tersebut.
c#
.net
fusion
typeloadexception
Benjol
sumber
sumber
Jawaban:
CATATAN - Jika jawaban ini tidak membantu Anda, luangkan waktu untuk menelusuri jawaban lain yang telah ditambahkan orang sejak saat itu.
Jawaban singkat
Ini bisa terjadi jika Anda menambahkan metode ke antarmuka dalam satu rakitan, dan kemudian ke kelas pelaksana di rakitan lain, tetapi Anda membangun kembali rakitan pelaksana tanpa merujuk ke versi baru dari rakitan antarmuka.
Dalam hal ini, DummyItem mengimplementasikan antarmuka dari perakitan lain. Metode SetShort baru-baru ini ditambahkan ke antarmuka dan DummyItem - tetapi perakitan yang berisi DummyItem dibangun kembali dengan merujuk pada versi sebelumnya dari perakitan antarmuka. Jadi metode SetShort ada di sana secara efektif, tetapi tanpa saus ajaib yang menghubungkannya dengan metode yang setara di antarmuka.
Jawaban panjang
Jika Anda ingin mencoba mereproduksi ini, coba yang berikut ini:
Buat proyek perpustakaan kelas: InterfaceDef, tambahkan hanya satu kelas, dan bangun:
Buat proyek perpustakaan kelas kedua: Implementasi (dengan solusi terpisah), salin InterfaceDef.dll ke direktori proyek dan tambahkan sebagai referensi file, tambahkan hanya satu kelas, dan bangun:
Buat yang ketiga, proyek konsol: ClientCode, salin kedua dll ke direktori proyek, tambahkan referensi file, dan tambahkan kode berikut ke dalam metode Utama:
Jalankan kode satu kali, konsol mengatakan "hello world"
Batalkan komentar kode dalam dua proyek dll dan bangun kembali - salin dua dll kembali ke proyek ClientCode, bangun kembali dan coba jalankan lagi. TypeLoadException terjadi ketika mencoba untuk instantiate ImplementingClass.
sumber
Selain apa yang sudah dijawab oleh si penanya, mungkin perlu diperhatikan hal-hal berikut. Alasan ini terjadi adalah karena kelas mungkin memiliki metode dengan tanda tangan yang sama dengan metode antarmuka tanpa menerapkan metode itu. Kode berikut menggambarkan bahwa:
sumber
Saya mendapatkan ini ketika aplikasi saya tidak memiliki referensi ke majelis lain yang mendefinisikan kelas bahwa metode dalam pesan kesalahan yang digunakan. Menjalankan PEVerify memberi kesalahan lebih bermanfaat: "Sistem tidak dapat menemukan file yang ditentukan."
sumber
Saya menemukan pesan yang sama dan inilah yang kami temukan: Kami menggunakan dll pihak ketiga dalam proyek kami. Setelah rilis baru dari mereka keluar kami mengubah proyek kami untuk menunjuk ke set dll baru dan berhasil dikompilasi.
Pengecualian dilemparkan ketika saya mencoba untuk membuat salah satu dari kelas yang saling berhubungan selama waktu berjalan. Kami memastikan bahwa semua referensi lain sudah mutakhir, tetapi masih belum berhasil. Kami perlu beberapa saat untuk mengenali (menggunakan Browser Objek) bahwa tipe kembalinya metode dalam pesan kesalahan adalah tipe yang sama sekali baru dari perakitan baru, yang tidak direferensikan.
Kami menambahkan referensi ke majelis dan kesalahannya hilang.
sumber
Saya menerima kesalahan ini dalam skenario berikut.
var target = Assembly.GetAssembly(typeof(FertPin.Classes.Contact));
Perbaikan untuk saya adalah meningkatkan referensi System.Web.Mvc di Majelis B ke 4.0.0.0. Tampak jelas sekarang!
Berkat poster aslinya!
sumber
Waktu lain Anda bisa mendapatkan kesalahan ini adalah jika Anda memiliki versi yang salah dari rakitan yang ditandatangani. Ini bukan gejala normal untuk penyebab ini, tapi di sini ada skenario di mana saya mendapatkannya
proyek asp.net berisi rakitan A dan rakitan B, B dinamai sangat
rakitan A menggunakan Activator.CreateInstance untuk memuat rakitan C (yaitu tidak ada referensi ke C yang dibangun secara terpisah)
C dibangun dengan referensi versi perakitan B yang lebih lama dari yang ada saat ini
berharap itu bisa membantu seseorang - butuh waktu lama bagi saya untuk mencari tahu.
sumber
Saya memiliki kesalahan ini juga, itu disebabkan oleh exe CPU Setiap referensi CPU Setiap majelis yang pada gilirannya direferensikan perakitan x86.
Pengecualian mengeluhkan metode pada kelas di MyApp.Implementations (Any CPU), yang menghasilkan MyApp.Interfaces (Any CPU), tetapi di fuslogvw.exe saya menemukan upaya tersembunyi 'untuk memuat program dengan format yang salah' pengecualian dari MyApp .CommonTypes (x86) yang digunakan oleh keduanya.
sumber
Saya terus kembali ke sini ... Banyak jawaban di sini melakukan pekerjaan yang baik untuk menjelaskan apa masalahnya tetapi tidak bagaimana cara memperbaikinya.
Solusi untuk ini adalah menghapus file bin secara manual di direktori proyek yang Anda publikasikan. Ini akan membersihkan semua referensi dan memaksa proyek untuk menggunakan DLL terbaru.
Saya tidak menyarankan menggunakan fungsi Hapus alat terbitkan karena ini cenderung membuang IIS.
sumber
Saya memiliki solusi esoterik lain untuk pesan kesalahan ini. Saya memutakhirkan kerangka target saya dari .Net 4.0 ke 4.6, dan proyek unit test saya memberi saya kesalahan "System.TypeLoadException ... tidak memiliki implementasi" kesalahan ketika saya mencoba membangun. Itu juga memberikan pesan kesalahan kedua tentang metode yang seharusnya tidak diterapkan yang sama yang mengatakan "Tugas 'BuildShadowTask' gagal secara tak terduga." Tidak ada saran di sini yang tampaknya membantu, jadi saya mencari "BuildShadowTask", dan menemukan posting di MSDN yang membuat saya menggunakan editor teks untuk menghapus baris-baris ini dari file csproj proyek unit test.
Setelah itu, kedua kesalahan hilang dan proyek dibangun.
sumber
Saya mengalami kesalahan ini dalam konteks di mana saya menggunakan Autofac dan banyak pemuatan perakitan dinamis.
Saat melakukan operasi resolusi Autofac, runtime akan gagal memuat salah satu rakitan. Pesan kesalahan mengeluhkan itu
Method 'MyMethod' in type 'MyType' from assembly 'ImplementationAssembly' does not have an implementation
. Gejala terjadi ketika berjalan pada Windows Server 2012 R2 VM, tetapi tidak terjadi pada Windows 10 atau Windows Server 2016 VM.ImplementationAssembly
direferensikanSystem.Collections.Immutable
1.1.37, dan berisi implementasiIMyInterface<T1,T2>
antarmuka, yang didefinisikan secara terpisahDefinitionAssembly
.DefinitionAssembly
direferensikanSystem.Collections.Immutable
1.1.36.Metode
IMyInterface<T1,T2>
yang "tidak diterapkan" memiliki parameter tipeIImmutableDictionary<TKey, TRow>
, yang didefinisikan dalamSystem.Collections.Immutable
.Salinan aktual yang
System.Collections.Immutable
ditemukan di direktori program adalah versi 1.1.37. Pada VM Windows Server 2012 R2 saya, GAC berisi salinanSystem.Collections.Immutable
1.1.36. Pada Windows 10 dan Windows Server 2016, GAC berisi salinanSystem.Collections.Immutable
1.1.37. Kesalahan pemuatan hanya terjadi ketika GAC berisi versi DLL yang lebih lama.Jadi, akar penyebab kegagalan beban perakitan adalah referensi yang tidak cocok
System.Collections.Immutable
. Definisi antarmuka dan implementasi memiliki tanda tangan metode yang tampak identik, tetapi sebenarnya tergantung pada versi yang berbedaSystem.Collections.Immutable
, yang berarti bahwa runtime tidak mempertimbangkan kelas implementasi untuk mencocokkan definisi antarmuka.Menambahkan pengalihan ikatan berikut ke file konfigurasi aplikasi saya memperbaiki masalah:
sumber
System.Collections.Immutable
. Dalam kasus saya, tidak ada banyak parameter kandidat lain atau tipe pengembalian dalam metode yang terpengaruh. Saya juga ingat menggunakan ILSpy untuk memeriksa metadata dependensi dalam DLL "DefinitionAssembly" dan "ImplementAssembly" yang dikompilasi, khususnya melihat versi referensi.System.Net.Http
paket, saya menambahkandependentAssembly
elemen untuk itu dan menyalin info dari ILSpy dan berfungsi sekarang, kesalahan sudah hilang!Saya mendapatkan ini dengan ketergantungan proyek berbentuk "berlian":
Saya mengkompilasi ulang proyek A tetapi bukan Proyek B, yang memungkinkan Proyek B untuk "menyuntikkan" versi lama dari Proyek D dll
sumber
Saya mengalami ini ketika saya mengganti nama proyek (dan nama perakitan), yang diandalkan oleh proyek ASP.NET. Jenis-jenis dalam proyek web mengimplementasikan antarmuka dalam perakitan dependen. Meskipun menjalankan Solusi Bersih dari menu Bangun, perakitan dengan nama sebelumnya tetap di
bin
folder, dan ketika proyek web saya dieksekusipengecualian di atas terlempar, mengeluh bahwa metode antarmuka dalam menerapkan jenis web tidak benar-benar diterapkan. Menghapus perakitan secara manual di
bin
folder proyek web menyelesaikan masalah.sumber
Saya juga mendapatkan kesalahan ini ketika sebelumnya saya mengaktifkan Cakupan Kode selama pengujian unit untuk salah satu majelis. Untuk beberapa alasan Visual Studio "buffered" versi lama DLL khusus ini meskipun saya telah memperbaruinya untuk mengimplementasikan versi baru dari antarmuka. Menonaktifkan Cakupan Kode menyingkirkan kesalahan.
sumber
Kesalahan ini juga dapat disebabkan jika perakitan dimuat menggunakan Assembly.LoadFrom (String) dan merujuk perakitan yang sudah dimuat menggunakan Assembly.Load (Byte []).
Misalnya, Anda telah menyematkan rujukan referensi aplikasi utama sebagai sumber daya tetapi aplikasi Anda memuat plug-in dari folder tertentu.
Alih-alih menggunakan LoadFrom, Anda harus menggunakan Load. Kode berikut akan melakukan pekerjaan:
sumber
Penjelasan lain untuk jenis masalah ini melibatkan dikelola C ++.
Jika Anda mencoba untuk rintisan antarmuka yang ditentukan dalam rakitan yang dibuat menggunakan C ++ terkelola yang memiliki tanda tangan khusus, Anda akan mendapatkan pengecualian ketika rintisan dibuat.
Ini berlaku untuk Badak Mocks dan mungkin kerangka kerja mengejek yang digunakan
System.Reflection.Emit
.Definisi antarmuka mendapatkan tanda tangan berikut:
Perhatikan bahwa tipe C ++
long
memetakan keSystem.Int32
(atau hanyaint
dalam C #). Ini adalah sesuatu yang agak tidak jelasmodopt
yang menyebabkan masalah seperti yang dinyatakan oleh Ayende Rahien di milis Rhino Mocks .sumber
System::Byte
. Saya mengubah tanda tangan untuk menerimaunsigned short
dan langit menjadi biru lagi.Saya baru saja memutakhirkan solusi dari MVC3 ke MVC5, dan mulai menerima pengecualian yang sama dari proyek pengujian Unit saya.
Memeriksa semua referensi yang mencari file lama, akhirnya menemukan bahwa saya perlu melakukan beberapa bindingRedirect untuk Mvc, dalam proyek unit test saya.
sumber
Dalam kasus saya ini membantu untuk mereset Toolbox WinForms.
Saya mendapat pengecualian saat membuka
Form
di desainer; Namun, mengkompilasi dan menjalankan kode dimungkinkan dan kode berperilaku seperti yang diharapkan. Pengecualian terjadi di lokalUserControl
mengimplementasikan antarmuka dari salah satu pustaka referensi saya. Kesalahan muncul setelah perpustakaan ini diperbarui.Ini
UserControl
terdaftar di WinForms Toolbox. Mungkin Visual Studio menyimpan referensi pada versi perpustakaan yang sudah ketinggalan zaman atau sedang menyimpan versi yang sudah usang di suatu tempat.Inilah cara saya pulih dari situasi ini:
Reset Toolbox
menu konteks. (Ini menghapus item khusus dari Toolbox).Dalam kasus saya, item-item Toolbox dikembalikan ke keadaan standarnya; namun, panah-Pointer tidak ada di Toolbox.
Dalam kasus saya, Visual Studio diakhiri dengan pengecualian pelanggaran dan dibatalkan.
Sekarang semuanya berjalan dengan lancar.
sumber
FWIW, saya mendapatkan ini ketika ada file konfigurasi yang diarahkan ke versi yang tidak ada dari rujukan yang direferensikan. Log fusion untuk kemenangan!
sumber
Saya mendapatkan kesalahan ini karena saya memiliki kelas di majelis 'C' yang ada di versi 4.5 dari framework, mengimplementasikan antarmuka di assembly 'A' yang ada di versi 4.5.1 dari framework dan berfungsi sebagai kelas dasar untuk assembly 'B' yang juga pada versi 4.5.1 dari framework. Sistem melempar pengecualian saat mencoba memuat perakitan 'B'. Selain itu, saya telah menginstal beberapa paket nuget yang menargetkan .net 4.5.1 di ketiga majelis. Untuk beberapa alasan, meskipun referensi nuget tidak ditampilkan di majelis 'B', itu berhasil dibangun.
Ternyata masalah sebenarnya adalah bahwa majelis merujuk pada versi berbeda dari paket nuget yang berisi antarmuka dan tanda tangan antarmuka telah berubah di antara versi.
sumber
Dalam kasus saya, saya sebelumnya mereferensikan
mylib
proyek di folder saudara di luar repo - sebut sajav1.0
.Kemudian saya melakukannya dengan benar dan menggunakannya melalui git submodule - sebut saja itu
v2.0
.consoleApp
Namun satu proyek tidak diperbarui dengan benar. Itu masih merujukv1.0
proyek lama di luar proyek git saya.Yang membingungkan , meskipun
*.csproj
jelas-jelas salah dan menunjukv1.0
, Visual Studio IDE menunjukkan jalan sebagaiv2.0
proyek! F12 untuk memeriksa antarmuka dan kelas pergi kev2.0
versi juga.Perakitan ditempatkan ke folder bin oleh kompiler adalah
v1.0
versi, maka sakit kepala.Fakta bahwa IDE berbohong kepada saya membuatnya sangat sulit untuk menyadari kesalahannya.
Solusi : Menghapus referensi proyek dari
ConsoleApp
dan membacanya.Tip Umum: Kompilasi ulang semua rakitan dari awal (jika memungkinkan, tentu saja tidak untuk paket nuget) dan periksa prangko seumur hidup di
bin\debug
folder. Setiap majelis tua tanggal adalah masalah Anda.sumber
Saya menghadapi masalah yang hampir sama. Saya menggaruk kepala saya apa yang menyebabkan kesalahan ini. Saya diperiksa silang, semua metode diimplementasikan.
Di Googling saya mendapat tautan ini antara lain. Berdasarkan komentar @Paul McLink, Dua langkah ini menyelesaikan masalah.
dan kesalahan hilang .
Mulai ulang VS Plugin
Terima kasih paul :)
Semoga ini bisa membantu seseorang yang menemukan kesalahan ini :)
sumber
Saya juga mengalami masalah ini saat menjalankan unittests saya. Aplikasi berjalan dengan baik dan tanpa kesalahan. Penyebab masalah dalam kasus saya adalah saya telah mematikan pembangunan proyek pengujian. Mengaktifkan kembali pembangunan proyek pengujian saya memecahkan masalah.
sumber
Saya melihat ini di Visual Studio Pro 2008 ketika dua proyek membangun majelis dengan nama yang sama, satu kelas lib SDF.dll, dan satu yang mereferensikan lib dengan nama perakitan sdf.exe. Ketika saya mengubah nama majelis referensi, pengecualian hilang
sumber
Ini berarti bahwa proyek implementasi sudah ketinggalan zaman dalam kasus saya. DLL yang berisi antarmuka dibangun kembali tetapi dll implementasi basi.
sumber
Inilah pendapat saya tentang kesalahan ini.
Menambahkan
extern
metode, tetapi tempel saya rusak. TheDllImportAttribute
punya menempatkan pada baris komentar.Memastikan atribut benar-benar dimasukkan dalam sumber memperbaiki masalah.
sumber
Saya mendapatkan ini di layanan WCF karena memiliki tipe build x86 yang dipilih, menyebabkan tempat sampah untuk hidup di bawah bin \ x86 bukan bin. Memilih CPU Apa pun menyebabkan DLL yang dikompilasi untuk kembali ke lokasi yang benar (saya tidak akan menjelaskan bagaimana ini terjadi di tempat pertama).
sumber
Saya memiliki masalah yang sama. Saya tahu bahwa perakitan saya, yang dimuat oleh program utama, memiliki beberapa referensi dengan "Salin Lokal" disetel ke true. Salinan referensi lokal ini sedang mencari referensi lain di folder yang sama, yang tidak ada karena "Salin Lokal" dari referensi lain disetel ke false. Setelah penghapusan referensi yang disalin "secara tidak sengaja" kesalahannya hilang karena program utama diatur untuk mencari lokasi referensi yang benar. Rupanya salinan referensi lokal mengacaukan urutan panggilan karena salinan lokal ini digunakan alih-alih yang asli yang ada dalam program utama.
Pesan dibawa pulang adalah bahwa kesalahan ini muncul karena tautan yang hilang untuk memuat rakitan yang diperlukan.
sumber
Dalam kasus saya, saya mencoba menggunakan
TypeBuilder
untuk membuat tipe.TypeBuilder.CreateType
melemparkan pengecualian ini. Saya akhirnya menyadari bahwa saya perlu menambahkanMethodAttributes.Virtual
atribut ketika memanggilTypeBuilder.DefineMethod
metode yang membantu mengimplementasikan antarmuka. Ini karena tanpa tanda ini, metode ini tidak mengimplementasikan antarmuka, melainkan metode baru dengan tanda tangan yang sama sebagai gantinya (bahkan tanpa menentukanMethodAttributes.NewSlot
).sumber
Sebagai tambahan: ini juga dapat terjadi jika Anda memperbarui paket nuget yang digunakan untuk menghasilkan rakitan palsu. Katakanlah Anda menginstal V1.0 dari paket nuget dan membuat rakitan palsu "fakeLibrary.1.0.0.0.Fake". Selanjutnya, Anda memperbarui ke versi terbaru dari paket nuget, katakanlah v1.1 yang menambahkan metode baru ke antarmuka. Perpustakaan Fakes masih mencari v1.0 perpustakaan. Cukup hapus rakitan palsu dan buat ulang. Jika itu masalahnya, ini mungkin akan memperbaikinya.
sumber
Saya menerima kesalahan ini setelah pembaruan windows baru-baru ini. Saya memiliki kelas layanan yang diatur untuk mewarisi dari antarmuka. Antarmuka berisi tanda tangan yang mengembalikan ValueTuple, fitur yang cukup baru di C #.
Yang bisa saya tebak adalah bahwa pembaruan windows menginstal yang baru, tetapi bahkan secara eksplisit merujuknya, memperbarui pengalihan yang mengikat, dll ... Hasil akhirnya hanya mengubah tanda tangan metode untuk sesuatu "standar" Saya kira Anda bisa mengatakannya.
sumber