Hata mesajı 'İstenen türlerden biri veya daha fazlası yüklenemedi. Daha fazla bilgi için LoaderExceptions özelliğini alın. '


347

Entity Framework , SQL Server 2000, Visual Studio 2008 ve Enterprise Library kullanarak bir uygulama geliştirdim .

Yerel olarak kesinlikle iyi çalışıyor, ancak projeyi test ortamımıza yerleştirdiğimde, aşağıdaki hatayı alıyorum:

İstenen türlerden biri veya daha fazlası yüklenemedi. Daha fazla bilgi için LoaderExceptions özelliğini alın

Yığın izleme: at System.Reflection.Module._GetTypesInternal (StackCrawlMark & ​​stackMark)

at System.Reflection.Assembly.GetTypes ()

System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly (LoadingContext bağlamı)

System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache (LoadingContext bağlamı)

System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache (Montaj montajı, Boolean loadReferencedAssemblies, Sözlük 2 knownAssemblies, Dictionary2 ve türleriInLoading, List`1 ve hatalar)

at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache (ObjectItemCollection objectItemCollection, Assembly montajı, Boolean loadReferencedAssemblies)

System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType (Tür türü)

System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType (Tür türü, Montaj çağrısı Montaj)

at System.Data.Objects.ObjectContext.CreateQuery [T] (Dize queryString, ObjectParameter [] parametreleri)

Varlık Çerçevesi sorunu var gibi görünüyor, nasıl düzeltmek için herhangi bir ipucu?


Bu sorunu çözmek için sihirli bir kurşun yok, ancak bu cevap stackoverflow.com/a/8824250/185022
AZ_

Yanıtlar:


105

Projemin referanslarının Yerel Kopyala özniteliğini true olarak ayarlayarak bu sorunu çözdüm.


33
ReflectionTypeLoadException türü istisnasını görene kadar iç istisnaları sondajı yapmaya devam ettiğimizde ve DLL bilgisi eksik veya bilgileri hakkında bilgi veren bir "LoaderExceptions" özelliğine sahiptir. O zaman uygun eylemleri oradan halledebiliriz.
Sai

19
Visual Studio'dan hata ayıklama yaptığınızda sorun değil. Peki, web uygulamanız sadece bu hatayı üretim sunucusuna atmaya ne dersiniz? Yerel Kopyala özniteliğini true olarak ayarladıktan sonra bile.
Yousi

2
Bu, yerel bir Visual Studio'da değil, bir üretim sunucusunda sorun için bir çözümdür. Yerel Kopyala başvurulan DLL dosyasını oluşturma zamanında kopyalar ve DLL ilk olarak çalışan uygulama ile aynı klasörde aranır. Oluşturma sırasında kopyalanan DLL'yi üretim sunucusunda doğru klasöre kopyalamadıysanız, sorun devam edebilir.
Mentoliptus

Benim durumumda da Microsoft.AspNetCore.Mvc.ViewFeatures
MFedatto

530

Bu hatanın gerçek sihirli mermi cevabı yok. Anahtar, sorunu anlamak için tüm bilgilere sahip olmaktır. Büyük olasılıkla dinamik olarak yüklenen bir montajda başvurulan bir montaj eksik. Bu derlemenin uygulamanızın bin dizininde olması gerekir.

Nelerin eksik olduğunu belirlemek için bu kodu kullanın.

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
Teşekkürler! Bu, MEF kullanan sistemlerde herhangi bir günlük kurulumunun parçası olmalıdır.
Bogi lenvig

4
Bu cevaba geri döndüğüm her seferinde oy verirsem, yaklaşık 5 daha fazla oy ... ve sayım olurdu
sǝɯɐſ

2
Hayatımı kurtardın. Çok teşekkür ederim. ASLA problemi bulamazdım. Benim proje yapısında derin gizlenen ve bu soruna neden, artık kullanmayan bazı eski dll oldu.
richard

4
sadece neyin eksik olduğunu bulmak, kullanmak throw new Exception(errorMessage);, umut birine yardımcı olur.
shaijut

2
Herhangi bir ekstra kod olmadan, visual studio'da Exception Settings'e gidin ve TypeLoadException arama kutusuna koyun, ardından çift vuruş onay kutularını etkinleştirin. Ayrıca, "Sadece kodum" hata ayıklama bölümündeki seçeneklerde devre dışı bırakmanız gerekebilir, böylece yazmadığınız bir bağımlılıkta gerçekleşirken istisnayı yakalayabilirsiniz.
David Burg

56

Benim için çalışan bir çözüm, bin / ve obj / klasörlerini silmek ve çözümü yeniden oluşturmaktı.


Test projesinin kendisini yeniden oluşturmak zorunda kaldım, burada test projesine mi yoksa test ettiğiniz projeye mi atıfta bulunduğunuzdan emin değilim.
Jason Axelson

4
Başka bir Yeniden Yorum: "Çözüm Gezgini" içindeki Çözüm düğümüne sağ tıklayın ve "Çözümü Temizle" ye tıklayın, ardından "Çözümü Yeniden Oluştur" a tıklayın. (Kaynak projenizde yeni bir ek varsa - çözümünüzdeki diğer projeler - bölüm (ler), bu değişikliklerin proje dll klasörünüze yansıtılmasına ve bu sorunu
çözmesine

Bu sorunu yaşıyordum. Önerildiği gibi, Visual Studio, Silinen bin klasörünü kapattım, projeyi yeniden açtım ve yeniden oluşturdum ve başarılı oldu.
Sagar S.

Bu, önemli değişikliklerle dallar arasında geçiş yaparken oluyordu. Bölmenin silinmesi işe yaradı. Temizlik ve yeniden oluşturma çalışma değildi.
JGTaylor

33

İki olası çözüm:

  1. Sürüm modunda derliyorsunuz ancak Hata Ayıklama dizininizden daha eski bir derlenmiş sürüm dağıtıyorsunuz (veya tersi).
  2. Test ortamınızda doğru .NET Framework sürümü yüklü değil.

Aynı sorunu yaşadım, 1. nokta benim için doğruydu. Teşekkürler William.
Matthew

Ben de aynı sorun var ... Ben iki öneriyi de geçirdim ve hala aynı hatayı alıyorum :(
David Kiff

Başvurduğunuz DLL "bloke" ise de olabilir. Üzerine sağ tıklayın ve "engellemeyi kaldır" ı seçin
Ben

3
Ayrıca, DLL projelerinden biri "Herhangi bir CPU" yerine "x64" oluşturmak için ayarlanmışsa bunun olduğunu buldu.
DCastenholz

Çıkarma ve yeniden çözeltiye bir proje ilave edildikten sonra, örneğin, derlemesi için seçilmemiş projesi - çözelti yapılandırması yanlış ise, 1. oluşabilir
surfen

13

Daha önce de belirtildiği gibi, genellikle orada bulunmayan bir meclis söz konusudur.

Hangi montajın eksik olduğunu tam olarak bilmek için hata ayıklayıcınızı ekleyin, bir kesme noktası ayarlayın ve kural dışı durum nesnesini gördüğünüzde 'LoaderExceptions' özelliğine gidin. Eksik montaj orada olmalı.

Umarım yardımcı olur!


1
Ayrıca biz ReflectionTypeLoadException türü istisna görene kadar iç istisnaları sondaj devam edebilir ve eksik veya uyumsuz DLL bilgileri hakkında bilgi veren bir "LoaderExceptions" özelliği vardır.
Sai

2
Birden fazla projeye sahip bir çözümde, LoaderExceptions'ta hangi projenin soruna neden olduğunu nasıl görebiliriz? System.Web.Mvc'in bulunamadığını görüyorum, ancak bu çözümdeki 20 projeden hangisinin sorun yaşayabileceğini bilmiyorum.
mrcoulson

9

Çözüm LoaderException'ı kontrol etmekti: Benim durumumda, bazı DLL dosyaları eksikti.

Resim açıklamasını buraya girin


6

IIS'ye dağıtım yaptıysanız , IIS'de 32 bit uygulamalara izin verdiğinizden emin olun . Bunu geçerli Uygulama Havuzunuzun ayarlarında tanımlayabilirsiniz.


6

Bir ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4 uygulamasıyla bu hatayla karşılaştım .

Geliştirme makinemde iyi çalışır (Windows Vista 64 bit). Sonra sunucuya dağıtıldığında ( Windows Server 2008 R2 SP1), oturum zaman aşımına uğrayana kadar çalışır. Bu yüzden uygulamayı dağıttık ve her şey iyi görünüyordu ve daha sonra 20 dakikalık oturum zaman aşımından sonra bıraktı ve sonra bu hata atılacaktı.

Bunu çözmek için, LoaderExceptions özelliğini almak için Ken Cox'un blogunda bu kodu kullandım .

Benim durumum için eksik DLL Microsoft.ReportViewer.ProcessingObjectModel(sürüm 10) oldu. Bu DLL , uygulamanın çalıştığı makinenin GAC yüklü olması gerekir . Microsoft indirme sitesinde bulunan Microsoft Rapor Görüntüleyicisi 2010 Yeniden Dağıtılabilir Paketi'nde bulabilirsiniz.


5

Başlangıçta Fusion günlük görüntüleyicisini denedim, ancak bu yardımcı olmadı, bu yüzden SOS uzantısıyla WinDbg'yi kullandım.

! dumpheap -stat -type Özel Durum / D

Sonra FileNotFoundExceptions inceledim. Özel durumdaki ileti, yüklenmeyen DLL'nin adını içeriyordu.

NB, / D köprü bağlantılı sonuçlar verir, bu nedenle FileNotFoundException özetindeki bağlantıyı tıklatın. Bu, istisnaların bir listesini getirecektir. Ardından, istisnalardan biri için bağlantıyı tıklayın. Bu istisnaları dumpobject edecektir. Ardından, istisna nesnesindeki İleti bağlantısını tıklamanız yeterlidir ve metni görürsünüz.



4

Bu sorun benim örneğim eksik başvuru oldu. Bir derleme app.config dosyasında belirtildi, ancak projede bir referansı yoktu.


3

Entity Framework kullanıyorsanız , aşağıdaki referansları yerel olarak kopyalamayı deneyin.

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

Bu başvurular için "Yerel Kopyala" özelliğini "Doğru" olarak değiştirin ve yayımlayın.


3

Tam olarak hiçbir şeyin neden çalışmadığını bilmek için başka bir çözüm (Microsoft Connect'ten):

  1. Bu kodu projeye ekleyin:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
  2. Nesil serileştirme derlemelerini kapatın.

  3. Oluşturun ve çalıştırın.

2

Visual Studio 2010'da geliştirilen bir .NET 4.0, ASP.NET MVC 2.0, Entity Framework 4.0 web uygulaması vardı. Aynı sorun vardı, bir Windows Server 2008 R2 sunucusunda çalıştı, ancak başka bir Windows Server 2008 R2 sunucusunda çalıştı , .NET ve ASP.NET MVC sürümleri aynı olsa da, bu hatayı sizinkiyle atar.

Miko'nun önerisini takip etmeye gittim, bu yüzden başarısız sunucuya Windows SDK v7.1 (x64) yükledim, böylece! Dumpheap'i çalıştırabilirim.

Eh, Windows SDK v7.1 (x64) kurulumunun sorunu çözdüğü ortaya çıktı. Eksik olan ne olursa olsun, SDK'ya dahil edilmiş olmalıdır. Windows 7 ve .NET Framework 4 için Microsoft Windows SDK'dan indirilebilir .


2

Bu özel sorunumu / çözümümü bu hata mesajının ilk sonucudur. Ben benim ilk başvurunun klasör içinde ikinci bir uygulama dağıtırken Benim durumumda, hata alındığı IIS . Her ikisi de aynı ada sahip bağlantı dizesini tanımlarken alt uygulamada bir çakışma olur ve bu da (bana göre) bu açık olmayan hata iletisini oluşturur. Ekleyerek çözüldü:

<clear/>

hiyerarşide daha yüksek web.config dosyalarının bağlantı dizelerini devralmasını engelleyen alt web uygulamasının bağlantı dizesi bloğunda, şöyle görünür:

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

Neler olup bittiğini belirlediğimde yardımcı olan bir referans Stack Overflow sorusu, bir alt uygulama üst web.config öğesinden devralınacak mıydı? .


2

Bu benim için çalıştı. Web.config dosyasına ekleyin

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

Bu hatayı aldım: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

Yedek montaj dosyalarını binklasörden sildikten sonra sorunum çözüldü .


2

Diğer cevapların hiçbiri size yardımcı olmazsa:

Bu sorun yaşadığımda, Windows hizmetimin bir x64 platformu için oluşturulduğu ve yanlışlıkla InstallUtil.exe'nin 32 bit sürümünü çalıştırıyordum. Bu nedenle, oluşturduğunuz platform için doğru InstallUtil sürümünü kullandığınızdan emin olun.


Benzer bir sorunum vardı. Hizmetimin kullandığı DLL'lerin bazıları 32 bit işlemci için derlendi, herhangi bir işlemciye değiştirildi ve şimdi çalışıyor.
Blake Thingstad

1

Diğer önerilerin hepsi iyidir. Benim durumumda, sorun geliştirici kutusunun Silverlight dahil olmak üzere çeşitli API'lerin x86 konumunu kullanan 64 bit bir makine olmasıydı .

Hedef platform, web uygulamasının konuşlandırıldığı 32 bit sunucuyla eşleşecek şekilde değiştirilerek, istenen türlerden bir veya daha fazlasını yükleyememe ile ilgili hataların çoğu kaldırıldı.


1

Referansların Özel Sürüm Özelliklerini false olarak değiştirdim ve bu yardımcı oldu.


1

Bir Visual Studio paketi (VSPackage) derlerken bildirilen aynı hata iletisi vardı. Tüm çözüm derlenir ve paket CreatePkgDef tarafından oluşturulurken hata atılır. Bunu söyledikten sonra, onu yükleyen uygulamam değil Microsoft'un kendi aracı olduğu için LoaderExceptions'ı yakalayamıyorum . (Gerçi CreatePkgDef'in karışıklığından ben sorumluyum.)

Benim durumumda kök neden benim çözüm zaten kayıtlı olan bir mydll.dll yarattığını oldu GAC CreatePgkDef hangisinin kullanılacağını karıştı bu yüzden, (ve onlar farklıdır) ve sadece hangi değil mi' hata atmak için karar t Gerçekten yararlı. GAC'deki MyDll.dll aynı ürünün yükleyicisi tarafından kaydedildi (açıkçası önceki sürüm, / hafifçe / farklı içerikle).

Nasıl düzeltilir?

  1. Tercih edilen yol: MyDll.dll dosyasının doğru sürümünü kullandığınızdan emin olun
    1. Projenizi derlerken, GAC'de bulunan önceki sürümde kullandığınızdan farklı bir sürüm numarası kullandığınızdan emin olun. Aşağıdaki özelliklerin doğru olduğundan emin olun:
      • [assembly: AssemblyVersion ("1.0.0.1")] // Eski DLL dosyasının sürüm 1.0.0.0 olduğunu varsayarsak
      • [assembly: AssemblyFileVersion ("1.0.0.1")] // Eski DLL dosyasının sürüm 1.0.0.0 olduğunu varsayarsak
    2. Gerekirse, diğer projelerinizde başvururken tam nitelikli derleme adını belirtin (örneğin, "MyDll.dll, Sürüm = 1.0.0.1, Kültür = nötr, PublicKeyToken = 1234567890abcdef").
  2. Yukarıdakiler başarısız olduysa: Eski MyDll.dll dosyasını GAC'den kaldırabilirsiniz
    1. Bir Montajı GAC'den Kaldırma
    2. MyDll.dll içeren uygulamayı kaldırın

AssemblyVersion'ı değiştirmek benim için yeterince iyiydi. :)

Umarım bu yardımcı olmuştur.


1

Paket Yöneticisi Konsolu ile Entity Framework geçişini eklemeye çalışırken aynı sorunu yaşadım (ancak yerelimde).

Bunu çözdüğüm yol, Main () aşağıdaki kodu içeren bir konsol uygulaması oluşturarak oldu:

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

Configuration sınıfının başarısız projenizin geçiş Konfigürasyonu olduğundan emin olun. DbMigrator kullanmak için System.Data.Entity.Migrations gerekir.

Uygulamanızda bir kesme noktası ayarlayın ve çalıştırın. Özel durum, Visual Studio tarafından yakalanmalıdır (hata ayıklama oturumunu kırmayacak şekilde ayarlanmış özel durum türü yoksa) ve aradığınız bilgileri bulabilmeniz gerekir.

Benim durumumda eksik referans EFProviderWrapperToolkit oldu.


1

Projelerden birine bir NuGet paketi yüklediğimde ve diğer projeyi güncellemeyi unuttuğumda bu sorunu yaşadım .

Bunu sadece aynı referans montajına sahip iki projeyi yaparak çözdüm.


Bağlantı için teşekkürler! NuGet'in ne olduğu hakkında hiçbir fikrim yoktu.
jebar8

1

Benim için de oldu. Sorunu şu şekilde çözdüm: Çözüm'ü sağ tıklayın, Çözüm için NuGet Paketlerini Yönetin ... Paketleri birleştirin ve paketleri aynı sürümde olacak şekilde yükseltin.


0

32 bit IIS modunu true, hata ayıklama modunu true olarak ayarlayın, tempdizini silin ve IIS'yi sıfırlayın, sorunu geçici olarak düzeltir ve bir süre sonra geri gelir.


0

Projelerinizin her birinin Configuration Manager'da doğru bir şekilde kurulduğunu doğrulayın .

William Edmondson'un bu sorunun nedenine benzer şekilde , Configuration Manager ayarımı "Debug" "Any CPU" dan "Debug" ".NET" olarak değiştirdim. Sorun ".NET" sürümü değil tüm projeler inşa etmek için yapılandırılmış, bu yüzden bazı DLL'leri güncel (diğerleri geçerli iken) oldu. Bu uygulamanın başlatılmasında birçok soruna neden oldu.

Geçici düzeltme Kenny Eliasson'un \ bin ve \ obj dizinlerini temizleme önerisini yapmaktı . Bununla birlikte, derleme yapmayan projelerde daha fazla değişiklik yapar yapmaz, her şey tekrar başarısız olur.


0

Bu sorunu Visual Studio 2015 ile yeni Microsoft Word eklentisi oluştururken de aldım. Sorun, MS Office, 2013 ve 2016'nın 2 sürümüne sahip olduğumla ilgili. MS Office 2013'ü kaldırıyorum ve sonra çalışıyor.


0

SharePoint için birkaç proje hazırladım ve elbette bunları dağıttım. Bir kez oldu.

C: \ Windows \ assembly \ temp \ xxx (FarManager ile) içinde eski bir derleme buldum, yeniden başlattıktan sonra kaldırdım ve tüm projeler oluşturuldu.

MSBuild için sorum var, çünkü projeler gibi bağlantılı proje montajlarında ve her montaj "Yerel kopyala" olarak işaretlenmiş, ancak GAC'dan değil.


0

Projede başvurulan tüm DLL dosyalarında "Copy Local = True" olarak işaretleyerek, yeniden oluşturup bir test sunucusunda dağıtarak bu sorunu giderebiliyorum.


0

Otomatik harita ile ilgili bir sorunum vardı. Gelen binklasör, dosya automap.4net.dll yoktu, ama nedense automap.xml ve automap.dll değildi. Bunları bindizine kopyalamak sorunu çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.