Pesan kesalahan 'Tidak dapat memuat satu atau lebih jenis yang diminta. Ambil properti LoaderExceptions untuk informasi lebih lanjut. '


347

Saya telah mengembangkan aplikasi menggunakan Entity Framework , SQL Server 2000, Visual Studio 2008 dan Enterprise Library.

Ini berfungsi dengan sangat baik secara lokal, tetapi ketika saya menyebarkan proyek ke lingkungan pengujian kami, saya mendapatkan kesalahan berikut:

Tidak dapat memuat satu atau lebih dari jenis yang diminta. Ambil properti LoaderExceptions untuk informasi lebih lanjut

Stack trace: di System.Reflection.Module._GetTypesInternal (StackCrawlMark & ​​stackMark)

di System.Reflection.Assembly.GetTypes ()

di System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly (Memuat konteks Konteks)

di System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache (Memuat konteks Konteks)

di System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache (Majelis perakitan, beban Boolean direferensikanAssemen, Kamus 2 knownAssemblies, Dictionary2 & jenisMenambah, Daftar`1 & kesalahan)

di System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyDariCache (ObjectItemCollection objectItemCollection, Assembly assembly, Boolean loadReferencedAssemblies)

di System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType (Type type)

di System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType (Tipe type, Assembly callingAssembly)

di System.Data.Objects.ObjectContext.CreateQuery [T] (String queryString, parameter ObjectParameter [])

Entity Framework tampaknya memiliki masalah, ada petunjuk bagaimana cara memperbaikinya?


Tidak ada peluru ajaib untuk menyelesaikan masalah ini tetapi jawaban ini akan membantu Anda mengetahui alasan yang paling tepat stackoverflow.com/a/8824250/185022
AZ_

Jawaban:


105

Saya memecahkan masalah ini dengan menetapkan atribut Salin Lokal dari referensi proyek saya menjadi true.


33
Ketika kami terus menelusuri pengecualian dalam hingga kami melihat pengecualian tipe ReflectionTypeLoadException dan Memiliki properti "LoaderExceptions" yang memberikan informasi tentang info DLL yang hilang atau tidak sesuai. Maka kita bisa mengurus tindakan yang sesuai dari sana.
Sai

19
baik, itu baik ketika Anda sedang melakukan debug dari Visual Studio. Tapi bagaimana kalau Anda aplikasi web hanya membuang kesalahan ini di server produksi? bahkan setelah Anda menetapkan atribut Salin Lokal ke true.
Yousi

2
Ini adalah solusi untuk masalah pada server produksi, bukan pada Visual Studio lokal. Salin Lokal menyalin DLL yang dirujuk saat membangun dan DLL pertama kali dicari dalam folder yang sama dengan aplikasi yang sedang berjalan. Masalahnya bisa bertahan jika Anda tidak menyalin DLL yang disalin saat membangun ke folder yang benar di server produksi.
Mentoliptus

Dalam kasus saya, saya juga harus menambahkan referensi nuget ke Microsoft.AspNetCore.Mvc.ViewFeatures
MFedatto

530

Kesalahan ini tidak memiliki jawaban peluru ajaib yang sebenarnya. Kuncinya adalah memiliki semua informasi untuk memahami masalahnya. Kemungkinan besar rakitan yang dimuat secara dinamis tidak memiliki rakitan yang direferensikan. Perakitan itu harus ada di direktori tempat sampah aplikasi Anda.

Gunakan kode ini untuk menentukan apa yang hilang.

using System.IO;
using System.Reflection;
using System.Text;

try
{
    //The code that causes the error goes here.
}
catch (ReflectionTypeLoadException ex)
{
    StringBuilder sb = new StringBuilder();
    foreach (Exception exSub in ex.LoaderExceptions)
    {
        sb.AppendLine(exSub.Message);
        FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
        if (exFileNotFound != null)
        {                
            if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
            {
                sb.AppendLine("Fusion Log:");
                sb.AppendLine(exFileNotFound.FusionLog);
            }
        }
        sb.AppendLine();
    }
    string errorMessage = sb.ToString();
    //Display or log the error based on your application.
}

4
Terima kasih! Ini harus menjadi bagian dari setiap pengaturan pencatatan dalam sistem yang menggunakan MEF.
Bogi lenvig

4
Jika saya dapat membesarkan setiap kali saya kembali ke jawaban ini itu akan memiliki sekitar 5 lebih banyak ... dan menghitung
jadi

2
Kau telah menyelamatkan hidupku. Terima kasih banyak. Saya TIDAK PERNAH akan menemukan masalah. Itu adalah beberapa dll lama saya tidak menggunakan lagi, bersembunyi jauh di dalam struktur proyek saya dan menyebabkan masalah ini.
richard

4
hanya untuk mengetahui dengan cepat apa yang hilang, gunakan throw new Exception(errorMessage);, harapan membantu seseorang.
shaijut

2
Tanpa kode tambahan, di studio visual pergi ke Pengaturan Pengecualian dan masukkan ke dalam kotak pencarian TypeLoadException lalu aktifkan kotak centang klik pasangan. Anda juga mungkin harus menonaktifkan opsi di bawah bagian debug "Hanya kode saya" sehingga Anda dapat menangkap pengecualian ketika terjadi dalam dependensi yang tidak Anda tulis.
David Burg

56

Salah satu solusi yang berhasil bagi saya adalah menghapus folder bin / dan obj / dan membangun kembali solusinya.


Saya harus membangun kembali proyek pengujian itu sendiri, tidak yakin apakah Anda mengacu pada proyek pengujian di sini atau proyek yang Anda uji.
Jason Axelson

4
Re-komentar lain: Klik kanan node Solution di "Solution Explorer" dan klik "Clean Solution", lalu klik "Rebuild Solution". (Jika ada tambahan baru dalam proyek sumber Anda - proyek lain dalam solusi Anda - bagian, ini menyebabkan perubahan harus tercermin folder dll proyek Anda dan menyelesaikan masalah ini)
Emre Guldogan

Saya mengalami masalah ini. Seperti yang disarankan, saya menutup Visual Studio, folder bin dihapus, membuka kembali proyek dan membangun kembali dan berhasil.
Sagar S.

Ini terjadi ketika saya berpindah antar cabang dengan perubahan signifikan. Menghapus tempat sampah berhasil. Pembersihan dan Pembangunan Kembali TIDAK berfungsi.
JGTaylor

33

Dua kemungkinan solusi:

  1. Anda mengkompilasi dalam mode Rilis tetapi menggunakan versi kompilasi yang lebih lama dari direktori Debug Anda (atau sebaliknya).
  2. Anda tidak memiliki versi yang benar dari .NET Framework yang diinstal di lingkungan pengujian Anda.

Saya memiliki masalah yang sama, poin 1 akurat untuk saya. Terima kasih William.
Matius

Saya memiliki masalah yang sama ini ... Saya telah melalui kedua saran dan masih menerima kesalahan yang sama :(
David Kiff

Ini juga dapat terjadi jika DLL yang dirujuk Anda "diblokir". Klik kanan padanya, dan pilih "unblock"
Ben

3
Juga menemukan ini terjadi jika salah satu proyek DLL ditetapkan untuk membangun "x64" alih-alih "Any CPU".
DCastenholz

# 1 dapat terjadi jika konfigurasi solusi salah - proyek tidak dipilih untuk membangun, misalnya setelah menghapus dan menambahkan lagi proyek ke solusi
surfen

13

Seperti yang telah disebutkan sebelumnya, biasanya perkumpulan tidak ada di sana.

Untuk mengetahui dengan tepat perakitan apa yang Anda lewatkan, lampirkan debugger Anda, atur breakpoint dan ketika Anda melihat objek pengecualian, telusuri ke properti 'LoaderExceptions'. Majelis yang hilang harus ada di sana.

Semoga ini bisa membantu!


1
Kita juga dapat terus menelusuri pengecualian dalam hingga kita melihat pengecualian tipe ReflectionTypeLoadException dan memiliki properti "LoaderExceptions" yang memberikan informasi tentang info DLL yang hilang atau tidak sesuai.
Sai

2
Dalam solusi dengan beberapa proyek, bagaimana kita melihat proyek mana yang menyebabkan masalah di LoaderExceptions? Saya melihat bahwa System.Web.Mvc tidak dapat ditemukan, tetapi saya tidak tahu yang mana dari 20 proyek dalam solusi ini yang mungkin mengalami masalah.
mrcoulson

9

Solusinya adalah memeriksa LoaderException: Dalam kasus saya, beberapa file DLL hilang.

Masukkan deskripsi gambar di sini


6

Pastikan Anda mengizinkan aplikasi 32 bit pada IIS jika Anda menggunakan IIS. Anda dapat menentukan ini pada pengaturan Application Pool Anda saat ini.


6

Saya mengalami kesalahan ini dengan aplikasi ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4.

Ini akan bekerja dengan baik pada mesin pengembangan saya (Windows Vista 64-bit). Kemudian ketika dikerahkan ke server ( Windows Server 2008 R2 SP1), itu akan berfungsi sampai sesi habis. Jadi kami akan menyebarkan aplikasi dan semuanya tampak baik-baik saja dan kemudian membiarkannya lebih dari batas waktu sesi 20 menit dan kemudian kesalahan ini akan terjadi.

Untuk mengatasinya, saya menggunakan kode ini di blog Ken Cox untuk mengambil properti LoaderExceptions.

Untuk situasi saya, DLL yang hilang adalah Microsoft.ReportViewer.ProcessingObjectModel(versi 10). DLL ini perlu diinstal di GAC dari mesin aplikasi berjalan. Anda dapat menemukannya di Paket Redistributable Microsoft Report Viewer 2010 yang tersedia di situs unduhan Microsoft.


5

Awalnya saya mencoba penampil log Fusion, tetapi itu tidak membantu jadi saya akhirnya menggunakan WinDbg dengan ekstensi SOS.

! dumpheap -stat -type Exception / D

Kemudian saya memeriksa FileNotFoundExceptions. Pesan dalam pengecualian berisi nama DLL yang tidak memuat.

NB, the / D memberi Anda hasil hyperlink, jadi klik pada tautan dalam ringkasan untuk FileNotFoundException. Itu akan memunculkan daftar pengecualian. Kemudian klik tautan untuk salah satu pengecualian. Itu akan! Membuang objek pengecualian itu. Maka Anda hanya bisa mengklik tautan untuk Pesan di objek pengecualian, dan Anda akan melihat teksnya.



4

Contoh saya tentang masalah ini akhirnya menjadi referensi yang hilang. Perakitan dirujuk di app.config tetapi tidak memiliki referensi dalam proyek.


3

Jika Anda menggunakan Entity Framework , cobalah menyalin referensi berikut secara lokal.

  • System.Data.Entity
  • System.Web.Entity

Ubah properti "Salin Lokal" ke "Benar" untuk referensi ini dan publikasikan.


3

Solusi lain untuk mengetahui mengapa tidak ada yang bekerja (dari Microsoft connect):

  1. Tambahkan kode ini ke proyek:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
  2. Matikan rakitan serialisasi generasi.

  3. Bangun dan eksekusi.

2

Saya memiliki aplikasi web .NET 4.0, ASP.NET MVC 2.0, Entity Framework 4.0 yang dikembangkan di Visual Studio 2010. Saya memiliki masalah yang sama, yaitu bekerja pada satu server Windows Server 2008 R2 tetapi tidak pada server Windows Server 2008 R2 lainnya, meskipun versi. NET dan ASP.NET MVC sama, melemparkan kesalahan yang sama seperti Anda.

Saya pergi untuk mengikuti saran miko, jadi saya menginstal Windows SDK v7.1 (x64) pada server yang gagal, sehingga saya bisa menjalankan! Dumpheap.

Nah, ternyata menginstal Windows SDK v7.1 (x64) menyelesaikan masalah. Ketergantungan apa pun yang hilang harus dimasukkan dalam SDK. Ini dapat diunduh dari Microsoft Windows SDK untuk Windows 7 dan .NET Framework 4 .


2

Menambahkan masalah / solusi spesifik saya ke ini karena ini adalah hasil pertama untuk pesan kesalahan ini. Dalam kasus saya, kesalahan diterima ketika saya menggunakan aplikasi kedua dalam folder aplikasi pertama saya di IIS . Keduanya mendefinisikan string koneksi dengan nama yang sama yang mengakibatkan aplikasi anak mengalami konflik dan pada gilirannya menghasilkan pesan kesalahan yang tidak jelas (bagi saya). Itu dipecahkan dengan menambahkan:

<clear/>

di blok string koneksi aplikasi web anak yang mencegahnya mewarisi string koneksi file web.config lebih tinggi dalam hierarki, sehingga terlihat seperti:

<connectionStrings>
  <clear/>
  <add name="DbContext" connectionString="MySERVER" providerName="System.Data.SqlClient" />
</connectionStrings>

Referensi Stack Overflow yang membantu ketika saya menentukan apa yang sedang terjadi adalah apakah aplikasi anak akan diwarisi dari web.config induknya? .


2

Ini berhasil untuk saya. Tambahkan di web.config Anda

<system.web>
  <trust level="Full" />

Saya mendapat kesalahan ini:It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

2

Masalah saya telah diatasi setelah saya menghapus file rakitan yang berlebihan dari binfolder.


2

Seandainya tidak ada jawaban lain yang membantu Anda:

Ketika saya memiliki masalah ini, ternyata layanan Windows saya dibangun untuk platform x64, dan saya secara tidak sengaja menjalankan versi 32-bit InstallUtil.exe. Jadi pastikan Anda menggunakan versi InstallUtil yang tepat untuk platform yang Anda bangun.


Saya punya masalah serupa. Beberapa DLL yang digunakan layanan saya dikompilasi untuk prosesor 32-bit, diubah menjadi prosesor apa pun dan sekarang berfungsi.
Blake Thingstad

1

Saran lainnya semuanya baik. Dalam kasus saya, masalahnya adalah bahwa kotak pengembang adalah mesin 64-bit menggunakan lokasi x86 dari berbagai API, termasuk Silverlight .

Dengan mengubah platform target agar sesuai dengan server 32-bit di mana aplikasi web sedang digunakan menghapus sebagian besar kesalahan yang terkait dengan tidak dapat memuat satu atau lebih dari jenis yang diminta.


1

Saya mengubah Properti Versi Spesifik dari Refrences menjadi false dan itu membantu.


1

Saya memiliki pesan kesalahan yang sama yang dilaporkan saat mengkompilasi paket Visual Studio (VSPackage). Seluruh solusi mengkompilasi dan kesalahan dilemparkan ketika paket sedang dibuat oleh CreatePkgDef. Karena itu, jelas bahwa saya tidak dapat menangkap LoaderExceptions karena bukan aplikasi saya yang melemparnya, tetapi alat Microsoft sendiri. (Meskipun saya bertanggung jawab atas kebingungan CreatePkgDef.)

Dalam kasus saya penyebab utama adalah bahwa solusi saya membuat MyDll.dll yang telah terdaftar ke GAC (dan mereka berbeda), sehingga CreatePgkDef bingung mana yang harus digunakan dan memutuskan hanya untuk melempar kesalahan yang bukan sangat membantu. MyDll.dll di GAC didaftarkan oleh penginstal produk yang sama (jelas versi sebelumnya, dengan / sedikit / konten berbeda).

Bagaimana memperbaikinya

  1. Cara yang disukai: Pastikan Anda menggunakan versi MyDll.dll yang benar
    1. Saat mengkompilasi proyek Anda, pastikan Anda menggunakan nomor versi yang berbeda dari yang Anda gunakan di versi sebelumnya yang terletak di GAC. Pastikan atribut berikut ini benar:
      • [assembly: AssemblyVersion ("1.0.0.1")] // Dengan asumsi file DLL lama versi 1.0.0.0
      • [assembly: AssemblyFileVersion ("1.0.0.1")] // Mengasumsikan file DLL lama versi 1.0.0.0
    2. Jika perlu, tentukan nama perakitan yang memenuhi syarat (misalnya, "MyDll.dll, Versi = 1.0.0.1, Budaya = netral, PublicKeyToken = 1234567890abcdef") ketika Anda referensi di proyek Anda yang lain.
  2. Jika hal di atas gagal: Anda dapat menghapus MyDll.dll lama dari GAC
    1. Cara Menghapus Instalasi dari GAC
    2. Copot pemasangan aplikasi yang menyertakan MyDll.dll

Mengubah AssemblyVersion cukup baik untukku. :)

Saya harap ini membantu.


1

Saya memiliki masalah yang sama (tetapi pada lokal saya) ketika saya mencoba menambahkan migrasi Kerangka Entity dengan Package Manager Console.

Cara saya menyelesaikannya adalah dengan membuat aplikasi konsol di mana Main () memiliki kode berikut:

 var dbConfig = new Configuration();
 var dbMigrator = new DbMigrator(dbConfig);
 dbMigrator.Update();

Pastikan kelas Konfigurasi adalah Konfigurasi migrasi proyek gagal Anda. Anda akan membutuhkan System.Data.Entity.Migrations untuk menggunakan DbMigrator.

Atur breakpoint di aplikasi Anda, dan jalankan. Pengecualian harus ditangkap oleh Visual Studio (kecuali jika Anda memiliki tipe pengecualian yang diatur untuk tidak memutus sesi debug), dan Anda harus dapat menemukan info yang Anda cari.

Referensi yang hilang dalam kasus saya adalah EFProviderWrapperToolkit.


1

Saya mendapatkan masalah ini ketika saya menginstal paket NuGet di salah satu proyek dan lupa memperbarui proyek lainnya.

Saya memecahkan ini dengan hanya membuat kedua proyek memiliki rakitan referensi yang sama.


Terima kasih untuk tautannya! Saya tidak tahu apa itu NuGet.
jebar8

1

Itu juga terjadi pada saya. Saya memecahkan masalah sebagai berikut: Klik kanan Solusi, Kelola Paket NuGet untuk Solusi ... Konsolidasi paket dan tingkatkan paket menjadi versi yang sama.


0

Atur mode IIS 32 bit ke true, mode debug ke true dalam file konfigurasi, menghapus tempdirektori dan mengatur ulang IIS memperbaiki masalah sementara dan kembali setelah beberapa waktu.


0

Verifikasi bahwa setiap proyek Anda diatur dengan benar di Pengelola Konfigurasi .

Mirip dengan William Edmondson's alasan untuk masalah ini, saya mengubah pengaturan Manajer Konfigurasi saya dari "Debug" "Any CPU" ke "Debug" ".NET". Masalahnya adalah bahwa versi ".NET" TIDAK dikonfigurasikan untuk membangun SEMUA proyek, sehingga beberapa DLL saya kedaluwarsa (sementara yang lain adalah saat ini). Ini menyebabkan banyak masalah dengan memulai aplikasi.

Perbaikan sementara adalah dengan melakukan saran Kenny Eliasson untuk membersihkan direktori \ bin dan \ obj. Namun, begitu saya membuat lebih banyak perubahan pada proyek yang tidak dikompilasi, semuanya akan gagal lagi.


0

Saya juga mendapatkan masalah ini ketika membuat tambahan Microsoft Word baru dengan Visual Studio 2015. Masalahnya adalah saya memiliki 2 versi MS Office, 2013 dan 2016. Saya menghapus instalasi MS Office 2013 dan kemudian berfungsi.


0

Saya membangun beberapa proyek untuk SharePoint dan, tentu saja, menyebarkannya. Suatu kali itu terjadi.

Saya menemukan perakitan lama di C: \ Windows \ assembly \ temp \ xxx (dengan FarManager), menghapusnya setelah reboot, dan semua proyek dibangun.

Saya punya pertanyaan untuk MSBuild, karena dalam kumpulan proyek terkait seperti proyek dan setiap perakitan ditandai "Salin lokal", tetapi tidak dari GAC.


0

Saya dapat memperbaiki masalah ini dengan menandai "Salin Lokal = Benar" pada semua file DLL yang dirujuk dalam proyek, membangun kembali dan menggunakan pada server pengujian.


0

Saya punya masalah dengan automap. Dalam binfolder tersebut, file automap.4net.dll ada di sana, tetapi karena alasan tertentu automap.xml dan automap.dll tidak. Menyalin mereka ke bindirektori memecahkan masalah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.