Komunikat o błędzie „Nie można załadować jednego lub więcej żądanych typów. Pobierz właściwość LoaderExceptions, aby uzyskać więcej informacji. ”

347

Opracowałem aplikację przy użyciu Entity Framework , SQL Server 2000, Visual Studio 2008 i Enterprise Library.

Działa absolutnie dobrze lokalnie, ale kiedy wdrażam projekt w naszym środowisku testowym, pojawia się następujący błąd:

Nie można załadować jednego lub więcej żądanych typów. Pobierz właściwość LoaderExceptions, aby uzyskać więcej informacji

Śledzenie stosu: w System.Reflection.Module._GetTypesInternal (StackCrawlMark & ​​stackMark)

w System.Reflection.Assembly.GetTypes ()

w System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly (kontekst ładowania kontekstu)

w System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache (kontekst ładowania kontekstu)

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache (zestaw montażowy, wartość logiczna loadReferencedAssemblies, słownik 2 knownAssemblies, Dictionary2 i typyInLoading, List`1 i błędy)

at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache (ObjectItemCollection objectItemCollection, Zespół złożenia, Boolean loadReferencedAssemblies)

at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType (typ typu)

at System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType (typ typu, wywołanie zestawuAssembly)

w System.Data.Objects.ObjectContext.CreateQuery [T] (String queryString, ObjectParameter [] parametry)

Entity Framework wydaje się mieć problem, jakiś pomysł, jak to naprawić?

Światło
źródło
Nie ma magicznej kuli do rozwiązania tego problemu, ale ta odpowiedź pomoże ci poznać dokładny powód stackoverflow.com/a/8824250/185022
AZ_

Odpowiedzi:

105

Rozwiązałem ten problem, ustawiając atrybut Kopiuj lokalnie w odniesieniach do mojego projektu na true.

Mentoliptus
źródło
33
Kiedy będziemy dokładniej analizować wewnętrzne wyjątki, dopóki nie zobaczymy wyjątku typu ReflectionTypeLoadException i ma on właściwość „LoaderExceptions”, która podaje informacje o brakujących lub niezgodnych informacjach DLL. Następnie możemy zająć się odpowiednimi działaniami stamtąd.
Sai
19
cóż, to dobrze, kiedy debugujesz z Visual Studio. Ale co powiesz na to, że jeśli aplikacja sieciowa rzuca ten błąd tylko na serwer produkcyjny? nawet po ustawieniu atrybutu Kopiuj lokalnie na true.
Yousi
2
Jest to rozwiązanie problemu na serwerze produkcyjnym, a nie na lokalnym programie Visual Studio. Kopiuj lokalnie kopiuje przywoływaną bibliotekę DLL podczas kompilacji, a biblioteka DLL jest najpierw przeszukiwana w tym samym folderze, co uruchomiona aplikacja. Problem może się utrzymywać, jeśli nie skopiujesz biblioteki DLL skopiowanej podczas kompilacji do odpowiedniego folderu na serwerze produkcyjnym.
Mentoliptus
W moim przypadku musiałem również dodać odniesienie do
modelu użytkowego
530

Ten błąd nie ma prawdziwej magicznej odpowiedzi na pocisk. Kluczem jest posiadanie wszystkich informacji, aby zrozumieć problem. Najprawdopodobniej w zespole ładowanym dynamicznie brakuje zestawu referencyjnego. Zestaw ten musi znajdować się w katalogu bin Twojej aplikacji.

Użyj tego kodu, aby ustalić, czego brakuje.

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.
}
Ben Gripka
źródło
4
Dzięki! Powinno to być częścią każdej konfiguracji rejestrowania w systemach korzystających z MEF.
Bogi lenvig
4
Gdybym mógł głosować za każdym razem, gdy wrócę do tej odpowiedzi, miałbym około 5 głosów pozytywnych ... i
wciąż rośnie
2
Uratowałeś mi życie. Dziękuję bardzo. NIGDY nie znalazłbym problemu. To była stara biblioteka dll, której już nie używałem, czając się głęboko w strukturze mojego projektu i powodując ten problem.
richard
4
aby szybko dowiedzieć się, czego brakuje, użyj throw new Exception(errorMessage);, nadzieja pomaga komuś.
shaijut
2
Bez dodatkowego kodu w Visual Studio przejdź do Ustawień wyjątków i wpisz w polu wyszukiwania TypeLoadException, a następnie zaznacz pola wyboru kilku trafień. Konieczne może być również wyłączenie opcji w sekcji debugowania „Tylko mój kod”, aby można było wychwycić wyjątek, gdy dzieje się to w zależności, której nie napisałeś.
David Burg
56

Jednym z rozwiązań, które działało dla mnie, było usunięcie folderów bin / i obj / i przebudowanie rozwiązania.

Kenny Eliasson
źródło
Musiałem przebudować sam projekt testowy, nie jestem pewien, czy masz na myśli projekt testowy tutaj, czy projekt testowany.
Jason Axelson
4
Kolejny komentarz: Kliknij prawym przyciskiem myszy węzeł Solution w „Solution Explorer” i kliknij „Clean Solution”, a następnie „Rebuild Solution”. (Jeśli w twoim projekcie źródłowym jest nowy dodatek - inne projekty w twoim rozwiązaniu - część (części), powoduje to, że zmiany zostaną odzwierciedlone w folderze dll projektu i rozwiązuje ten problem)
Emre Guldogan
Miałem ten problem. Jak zasugerowałem, zamknąłem Visual Studio, usunąłem folder bin, ponownie otworzyłem projekt i przebudowałem i zakończyło się sukcesem.
Sagar S.
Działo się tak, kiedy przełączałem się między gałęziami z istotnymi zmianami. Usunięcie kosza zadziałało. Czyszczenie i przebudowa NIE działały.
JGTaylor,
33

Dwa możliwe rozwiązania:

  1. Kompilujesz w trybie Release, ale wdrażasz starszą skompilowaną wersję z katalogu debugowania (lub odwrotnie).
  2. Nie masz zainstalowanej poprawnej wersji .NET Framework w środowisku testowym.
William Edmondson
źródło
Miałem ten sam problem, punkt 1 był dla mnie dokładny. Dzięki Williamie.
Matthew
Mam ten sam problem ... Przeszedłem przez obie te sugestie i wciąż otrzymuję ten sam błąd :(
David Kiff,
Może się to również zdarzyć, jeśli wskazana biblioteka DLL zostanie „zablokowana”. Kliknij go prawym przyciskiem myszy i wybierz „odblokuj”
Ben
3
Stwierdzono również, że tak się dzieje, jeśli jeden z projektów DLL został ustawiony na kompilację „x64” zamiast „Any CPU”.
DCastenholz
# 1 może wystąpić, jeśli konfiguracja rozwiązania jest niepoprawna - projekt nie został wybrany do kompilacji, na przykład po usunięciu i ponownym dodaniu projektu do rozwiązania
surfowanie
13

Jak już wspomniano wcześniej, zwykle nie ma tam zgromadzenia.

Aby dokładnie wiedzieć, którego zestawu brakuje, podłącz debugger, ustaw punkt przerwania, a gdy zobaczysz obiekt wyjątku, przejdź do właściwości „LoaderExceptions”. Brakujący zestaw powinien tam być.

Mam nadzieję, że to pomoże!

mkorman
źródło
1
Możemy także kontynuować drążenie wewnętrznych wyjątków, dopóki nie zobaczymy wyjątku typu ReflectionTypeLoadException i ma właściwość „LoaderExceptions”, która podaje informacje o brakujących lub niezgodnych informacjach DLL.
Sai
2
W jaki sposób w rozwiązaniu z wieloma projektami widzimy, który projekt powoduje problem w LoaderExceptions? Widzę, że nie można znaleźć System.Web.Mvc, ale nie wiem, który z 20 projektów w tym rozwiązaniu może mieć problem.
mrcoulson,
9

Rozwiązaniem było sprawdzenie LoaderException: W moim przypadku brakowało niektórych plików DLL.

Wpisz opis zdjęcia tutaj

Dev
źródło
6

Upewnij się, że zezwalasz na aplikacje 32-bitowe w IIS, jeśli zostały wdrożone w IIS. Możesz to zdefiniować w ustawieniach swojej aktualnej puli aplikacji.

MrKhal
źródło
6

Ten błąd wystąpił w programie ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4.

Działa dobrze na moim komputerze programistycznym (Windows Vista 64-bit). Następnie po wdrożeniu na serwerze ( Windows Server 2008 R2 z dodatkiem SP1) działałoby do momentu przekroczenia limitu czasu sesji. Wdrożylibyśmy aplikację i wszystko wyglądało dobrze, a następnie pozostawiliśmy na ponad 20 minutowy limit czasu sesji, a następnie ten błąd zostałby zgłoszony.

Aby go rozwiązać, użyłem tego kodu na blogu Kena Coxa aby pobrać właściwość LoaderExceptions.

W mojej sytuacji brakowało biblioteki DLL Microsoft.ReportViewer.ProcessingObjectModel(wersja 10). Ta biblioteka DLL musi być zainstalowana w GAC komputera, na którym działa aplikacja. Można go znaleźć w pakiecie redystrybucyjnym Microsoft Report Viewer 2010 dostępnym w witrynie pobierania firmy Microsoft.

Dziekan
źródło
5

Początkowo próbowałem przeglądarki dziennika Fusion, ale to nie pomogło, więc skończyłem z WinDbg z rozszerzeniem SOS.

! dumpheap -stat -type Wyjątek / D

Następnie zbadałem wyjątki FileNotFoundExceptions. Komunikat w wyjątku zawierał nazwę biblioteki DLL, która się nie ładowała.

Uwaga: / D daje wyniki hiperłącza, więc kliknij link w podsumowaniu dla FileNotFoundException. Spowoduje to wyświetlenie listy wyjątków. Następnie kliknij link jednego z wyjątków. To zrzuci te wyjątki. Następnie powinieneś być w stanie po prostu kliknąć link do wiadomości w obiekcie wyjątku, a zobaczysz tekst.

miko
źródło
4

Moje wystąpienie tego problemu zakończyło się brakującym odniesieniem. Do zestawu przywołano w app.config, ale nie miał on odniesienia w projekcie.

SteveCav
źródło
3

Jeśli używasz Entity Framework , spróbuj skopiować następujące odwołania lokalnie.

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

Zmień właściwość „Kopiuj lokalnie” na „Prawda” dla tych odniesień i opublikuj.

SameerPc
źródło
3

Kolejne rozwiązanie, aby dowiedzieć się, dlaczego dokładnie nic nie działa (z Microsoft Connect):

  1. Dodaj ten kod do projektu:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
  2. Wyłącz generowanie zestawów serializacji.

  3. Kompiluj i wykonuj.
Siarhei Kuchuk
źródło
2

Miałem .NET 4.0, ASP.NET MVC 2.0, Entity Framework 4.0 opracowaną w Visual Studio 2010. Miałem ten sam problem, że działał na jednym Windows Server 2008 R2, ale nie na innym serwerze Windows Server 2008 R2, mimo że wersje .NET i ASP.NET MVC były takie same, zgłasza ten sam błąd co twój.

Poszedłem zgodnie z sugestią miko, więc zainstalowałem Windows SDK 7.1 (x64) na uszkodzonym serwerze, aby móc uruchomić! Dumpheap.

Okazuje się, że zainstalowanie zestawu Windows SDK 7.1 (x64) rozwiązało problem. Jakakolwiek zależność była brakująca, musiała zostać zawarta w zestawie SDK. Można go pobrać z zestawu Microsoft Windows SDK dla systemu Windows 7 i .NET Framework 4 .

Mafi Osori
źródło
2

Dodanie do tego mojego konkretnego problemu / rozwiązania, ponieważ jest to pierwszy wynik tego komunikatu o błędzie. W moim przypadku wystąpił błąd, gdy wdrożyłem drugą aplikację w folderze mojej pierwszej aplikacji w IIS . Oba definiowały parametry połączenia o tej samej nazwie, co spowodowało konflikt aplikacji podrzędnej i generowało ten (dla mnie) nieoczywisty komunikat o błędzie. Zostało to rozwiązane poprzez dodanie:

<clear/>

w bloku ciągu połączenia potomnej aplikacji internetowej, który uniemożliwił jej dziedziczenie ciągów połączeń plików web.config znajdujących się wyżej w hierarchii, więc wygląda to tak:

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

Referencyjne pytanie przepełnienia stosu, które pomogło, gdy ustaliłem, co się dzieje, to czy aplikacja potomna odziedziczy po nadrzędnym pliku web.config? .

Mateusz
źródło
2

To zadziałało dla mnie. Dodaj go w pliku web.config

<system.web>
  <trust level="Full" />
Rahul Nikate
źródło
Otrzymałem ten błąd: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

Mój problem został rozwiązany po usunięciu zbędnych plików zespołu z binfolderu.

użytkownik 2814851
źródło
2

W przypadku, gdy żadna z pozostałych odpowiedzi nie pomoże:

Kiedy miałem ten problem, okazało się, że moja usługa Windows została zbudowana na platformę x64 i nieumyślnie uruchomiłem 32-bitową wersję InstallUtil.exe. Upewnij się więc, że używasz odpowiedniej wersji InstallUtil dla platformy, dla której zbudowałeś.

jkindwall
źródło
Miałem podobny problem. Niektóre biblioteki DLL używane przez moją usługę zostały skompilowane dla procesora 32-bitowego, zmienione na dowolny procesor i działa teraz.
Blake Thingstad,
1

Inne sugestie są dobre. W moim przypadku problem polegał na tym, że pole programisty było 64-bitową maszyną używającą lokalizacji x86 różnych interfejsów API, w tym Silverlight .

Zmieniając platformę docelową w celu dopasowania do 32-bitowego serwera, na którym wdrażana była aplikacja internetowa, usunięto większość błędów związanych z niemożnością załadowania jednego lub więcej żądanych typów.

rclopez
źródło
1

Zmieniłem właściwość konkretnej wersji Refrences na false i to pomogło.

Dow Miller
źródło
1

Ten sam komunikat o błędzie został zgłoszony podczas kompilowania pakietu Visual Studio (VSPackage). Całe rozwiązanie się kompiluje, a błąd jest generowany, gdy pakiet jest tworzony przez CreatePkgDef. To powiedziawszy, jasne jest, że nie mogę złapać wyjątków LoaderExceptions ponieważ to nie moja aplikacja je wyrzuca, ale własne narzędzie Microsoft. (Chociaż jestem odpowiedzialny za zamieszanie w CreatePkgDef.)

W moim przypadku główną przyczyną było to, że moje rozwiązanie tworzy plik MyDll.dll, który został już zarejestrowany w GAC (i są różne), więc CreatePgkDef pomylił, którego użyć, i postanowił po prostu zgłosić błąd, który nie jest naprawdę pomocny. MyDll.dll w GAC został zarejestrowany przez instalatora tego samego produktu (oczywiście wcześniejszej wersji, z / nieznacznie / inną zawartością).

Jak to naprawić

  1. Preferowany sposób: upewnij się, że używasz poprawnej wersji MyDll.dll
    1. Podczas kompilowania projektu upewnij się, że używasz innego numeru wersji niż poprzednia wersja znajdująca się w GAC. Upewnij się, że następujące atrybuty są poprawne:
      • [zespół: AssemblyVersion („1.0.0.1”)] // Zakładając, że stary plik DLL ma wersję 1.0.0.0
      • [assembly: AssemblyFileVersion („1.0.0.1”)] // Zakładając, że stary plik DLL został zaktualizowany do wersji 1.0.0.0
    2. W razie potrzeby określ pełną nazwę zestawu (na przykład „MyDll.dll, wersja = 1.0.0.1, Kultura = neutralna, PublicKeyToken = 1234567890abcdef”), gdy odwołujesz się do niej w innych projektach.
  2. Jeśli powyższe nie powiedzie się: możesz odinstalować starą MyDll.dll z GAC
    1. Jak odinstalować zestaw z GAC
    2. Odinstaluj aplikację zawierającą MyDll.dll

Zmiana zestawu Wersja była dla mnie wystarczająca. :)

Mam nadzieję, że to było pomocne.

Shakaron
źródło
1

Miałem ten sam problem (ale mój lokalny), gdy próbowałem dodać migrację Entity Framework za pomocą konsoli Menedżera pakietów.

Rozwiązałem to, tworząc aplikację konsolową, w której Main () miał następujący kod:

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

Upewnij się, że klasa Configuration jest konfiguracją migracji Twojego nieudanego projektu. Będziesz potrzebował System.Data.Entity.Migrations, aby korzystać z DbMigrator.

Ustaw punkt przerwania w aplikacji i uruchom go. Wyjątek powinien zostać przechwycony przez Visual Studio (chyba że masz ustawiony ten typ wyjątku, aby nie przerywać sesji debugowania) i powinieneś być w stanie znaleźć informacje, których szukasz.

Brakującym odniesieniem w moim przypadku był EFProviderWrapperToolkit.

Peter Nagy
źródło
1

Ten problem wystąpił, gdy zainstalowałem pakiet NuGet w jednym z projektów i zapomniałem zaktualizować drugi projekt.

Rozwiązałem to, tworząc oba projekty z tym samym zestawem referencyjnym.

jayson.centeno
źródło
Dzięki za link! Nie miałem pojęcia, co to jest NuGet.
jebar8
1

Stało się to także dla mnie. Rozwiązałem problem w następujący sposób: Kliknij prawym przyciskiem myszy Rozwiązanie, Zarządzaj pakietami NuGet dla rozwiązania ... Skonsoliduj pakiety i zaktualizuj pakiety, aby były w tej samej wersji.

użytkownik1760527
źródło
0

Ustaw 32-bitowy tryb IIS na true, tryb debugowania na true w pliku konfiguracyjnym, usunięcie tempkatalogu i zresetowanie IIS tymczasowo rozwiązuje problem i powraca po pewnym czasie.

Jasio
źródło
0

Sprawdź, czy każdy projekt jest poprawnie skonfigurowany w programie Configuration Manager .

Podobnie jak przyczyna tego problemu dla Williama Edmondsona, zmieniłem ustawienie Menedżera konfiguracji z „Debuguj” „Dowolny procesor” na „Debuguj” „.NET”. Problem polegał na tym, że wersja „.NET” NIE została skonfigurowana do budowania WSZYSTKICH projektów, więc niektóre z moich bibliotek DLL były nieaktualne (podczas gdy inne były aktualne). Powodowało to wiele problemów z uruchomieniem aplikacji.

Tymczasową poprawką było zrobienie sugestii Kenny'ego Eliassona, aby wyczyścić katalogi \ bin i \ obj. Jednak gdy tylko wprowadzę więcej zmian w projektach niekompilujących, wszystko znów się nie powiedzie.

cat5dev
źródło
0

Ten problem również pojawił się podczas tworzenia nowego dodatku Microsoft Word w programie Visual Studio 2015. Problem dotyczy około 2 wersji MS Office, 2013 i 2016. Odinstalowuję MS Office 2013, a potem działa.

amzdmt
źródło
0

Tworzę kilka projektów dla SharePoint i oczywiście je wdrażam. Pewnego razu to się stało.

Znalazłem stary zestaw w C: \ Windows \ assembly \ temp \ xxx (z FarManager), usunąłem go po ponownym uruchomieniu i wszystkie projekty zostały zbudowane.

Mam pytanie do MSBuild, ponieważ w zestawach projektów połączonych jak projekty, a każdy zestaw jest oznaczony jako „Kopiuj lokalnie”, ale nie z GAC.

Ilya
źródło
0

Jestem w stanie rozwiązać ten problem, zaznaczając „Kopiuj lokalnie = prawda” na wszystkich plikach DLL, do których istnieją odniesienia w projekcie, przebudowując i wdrażając na serwerze testowym.

Srinivasa Rao
źródło
0

Miałem problem z automapem. W binfolderze był plik automap.4net.dll, ale z jakiegoś powodu nie było plików automap.xml i automap.dll. Skopiowanie ich do binkatalogu rozwiązało problem.

alex440
źródło