Повідомлення про помилку "Неможливо завантажити один або кілька запитуваних типів. Отримайте властивість LoaderExceptions для отримання додаткової інформації. "


347

Я розробив додаток за допомогою Entity Framework , SQL Server 2000, Visual Studio 2008 та Enterprise Library.

Він працює нормально локально, але коли я розгортаю проект у нашому тестовому середовищі, я отримую таку помилку:

Неможливо завантажити один або кілька запитуваних типів. Отримайте властивість LoaderExceptions для отримання додаткової інформації

Трасування стека: у System.Reflection.Module._GetTypesInternal (StackCrawlMark & ​​stackMark)

на System.Reflection.Assembly.GetTypes ()

на System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly (контекст LoadingContext)

на System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache (контекст LoadingContext)

на System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache (збірка збірки, булева завантаженняReferencedAssemblies, словник 2 knownAssemblies, Dictionary2 та типиInOading, List`1 та помилки)

в System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache (ObjectItemCollection objectItemCollection, асамблея асамблеї, булева нагрузкаReferencedAssemblies)

на System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType (Тип типу)

на System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType (Тип типу, тип складання викликуАсемблення)

в System.Data.Objects.ObjectContext.CreateQuery [T] (String queryString, ObjectParameter [] параметри)

Здається, що в Entity Framework є проблема, будь-який підказки, як це виправити?


Там немає чарівної кулі , щоб вирішити цю проблему , але ця відповідь допоможе вам знати дуже точну причину stackoverflow.com/a/8824250/185022
AZ_

Відповіді:


105

Я вирішив цю проблему, встановивши атрибут Copy Local з посилань мого проекту на true.


33
Коли ми продовжуємо свердлити внутрішні винятки, поки не побачимо виняток типу ReflectionTypeLoadException, і він має властивість "LoaderExceptions", яка дає інформацію про відсутні або невідповідність інформації DLL. Тоді ми можемо подбати про відповідні дії звідти.
Сай

19
добре, це добре, коли ви налагоджуєте програму від Visual Studio. А як же бути, якщо веб-додаток кидає цю помилку лише на виробничий сервер? навіть після встановлення атрибута Copy Local на значення true.
Юсі

2
Це рішення проблеми на виробничому сервері, а не на локальній Visual Studio. Копіювати локально копіює згадану DLL під час збирання, і DLL спочатку шукається в тій самій папці, що і запущена програма. Проблема може зберігатися, якщо ви не скопіювали DLL, який було скопійовано під час збирання, у правильну папку на виробничому сервері.
Ментоліпт

У моєму випадку мені довелося також додати чітке посилання на Microsoft.AspNetCore.Mvc.ViewFeatures
MFedatto

530

Ця помилка не відповідає справжній магічній відповіді кулі. Головне - мати всю інформацію, щоб зрозуміти проблему. Швидше за все, у динамічно завантаженій збірці відсутня посилальна збірка. Ця збірка повинна знаходитися в довідковому коді Вашої програми.

Використовуйте цей код, щоб визначити, чого немає.

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
Дякую! Це має бути частиною будь-якої установки журналу в системах, які використовують MEF.
Bogi lenvig

4
Якби я міг подати заяву кожного разу, коли я повернусь до цієї відповіді, у неї було б ще 5 пропозицій ... і підрахунок
sǝɯɐſ

2
Ти врятував мені життя. Дуже дякую. Я НІКОЛИ не знайшов би проблеми. Це був якийсь старий DLL, який я більше не використовував, ховаючись глибоко в структуру свого проекту і викликаючи цю проблему.
Річард

4
просто швидко дізнатись, чого не вистачає, використовувати throw new Exception(errorMessage);, сподіватися, що хтось допомагає
shaijut

2
Без зайвого коду, у візуальній студії перейдіть у Налаштування винятку та поставте у вікні пошуку TypeLoadException, а потім увімкніть прапорці пара переходів. Також вам може знадобитися відключити параметри в розділі налагодження "Просто мій код", щоб ви могли зловити виняток, коли це відбувається в залежності, яку ви не писали.
Девід Бург

56

Одне з моїх рішень було видалити папки bin / i obj / та відновити рішення.


Мені довелося заново створити тестовий проект, не впевнений, чи ви маєте на увазі тут тестовий проект чи проект, який ви тестуєте.
Джейсон Аксельсон

4
Ще один повторний коментар: Клацніть правою кнопкою миші вузол рішення в «Провідник рішень» і натисніть «Очистити рішення», а потім натисніть «Відновити рішення». (Якщо у вашому проекті-джерелі є нове доповнення - інші проекти у вашому рішенні - частина (-и), це призводить до того, що зміни відображаються у вашій папці dll проекту та вирішують цю проблему)
Емре Гулдоган,

У мене виникло це питання. Як було запропоновано, я закрив Visual Studio, видалену папку бін, знову відкрив проект і відновив, і це було успішно.
Сагар С.

Це відбувалося, коли я перемикався між гілками зі значними змінами. Видалення кошика спрацювало. Прибирання та відновлення НЕ працювали.
JGTaylor

33

Два можливих рішення:

  1. Ви збираєтеся в режимі випуску, але розгортаєте стару компільовану версію зі свого каталогу налагодження (або навпаки).
  2. У вас не встановлена ​​правильна версія .NET Framework у вашому тестовому середовищі.

У мене була така ж проблема, пункт 1 був для мене точним. Дякую Вільяму.
Метью

У мене є ця сама проблема ... Я пережив обидві пропозиції, і все одно отримую ту саму помилку :(
Девід Кіфф,

Це також може статися, якщо ваша посилання на DLL "заблокована". Клацніть правою кнопкою миші та виберіть "Розблокувати"
Ben

3
Також це виявилося, якщо один із проектів DLL був налаштований на створення "x64" замість "Будь-якого процесора".
DCastenholz

# 1 може статися, якщо конфігурація рішення невірна - проект не обраний для збирання, наприклад після видалення та додавання проекту до рішення
перегляньте

13

Як вже згадувалося раніше, зазвичай це справа, коли зборів немає.

Щоб точно знати, якої збірки вам не вистачає, приєднайте налагоджувач, встановіть точку розриву і, побачивши об’єкт виключення, перейдіть до властивості "LoaderExceptions". Зникла збірка повинна бути там.

Сподіваюся, це допомагає!


1
Крім того, ми можемо продовжувати свердління внутрішніх винятків, поки не побачимо виняток типу ReflectionTypeLoadException і він має властивість "LoaderExceptions", яка дає інформацію про відсутню або невідповідну інформацію про DLL.
Сай

2
Як у вирішенні кількох проектів ми бачимо, який проект викликає проблему в LoaderExceptions? Я бачу, що System.Web.Mvc неможливо знайти, але я не знаю, який з 20 проектів у цьому рішенні може мати проблеми.
mrcoulson

9

Рішенням було перевірити LoaderException: У моєму випадку деякі файли DLL відсутні.

Введіть тут опис зображення


6

Переконайтеся, що ви дозволяєте 32-бітним програмам на IIS, якщо ви розгорнули в IIS. Ви можете визначити це в налаштуваннях вашого поточного пулу програм.


6

Я зіткнувся з цією помилкою в ASP.NET 4 + SQL Server 2008 R2 + Entity Framework додатку 4.

Це буде добре працювати на моїй розробній машині (Windows Vista 64-розрядна). Потім при розгортанні на сервері ( Windows Server 2008) R2 SP1) він працюватиме до закінчення сеансу. Тож ми би розгорнули додаток, і все виглядало нормально, а потім залишимо його більше 20-хвилинного тайм-ауту сеансу, і тоді ця помилка буде викинута.

Для її вирішення я використав цей код у блозі Кен Кокса щоб отримати властивість LoaderExceptions.

Для моєї ситуації відсутня DLL Microsoft.ReportViewer.ProcessingObjectModel(версія 10). Цю DLL потрібно встановити в GAC машини, на якій працює програма. Ви можете знайти його у пакеті перерозподілюваного пакета Microsoft Viewer 2010, доступному на веб-сайті завантаження Microsoft.


5

Спочатку я спробував переглядач журналу Fusion, але це не допомогло, тому я в кінцевому рахунку використовував WinDbg з розширенням SOS.

! dumpheap -stat -type Виняток / D

Потім я вивчив FileNotFoundExceptions. Повідомлення за винятком містило ім'я DLL, яке не завантажувалося.

Примітка: / D дає результати з гіперпосиланнями, тому натисніть на посилання у резюме для FileNotFoundException. Це призведе до списку винятків. Потім натисніть на посилання для одного з винятків. Це буде! Спростовувати ці винятки. Тоді вам слід просто мати можливість натиснути на посилання для повідомлення в об’єкті винятків, і ви побачите текст.



4

Мій приклад цієї проблеми виявився відсутнім посиланням. Збірка була згадана в app.config, але не мала посилання в проекті.


3

Якщо ви використовуєте Entity Framework , спробуйте скопіювати такі посилання на місцевому рівні.

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

Змініть властивість "Копіювати місцеве" на "Істинне" для цих посилань та опублікуйте.


3

Ще одне рішення знати, чому точно нічого не працює (від Microsoft connect):

  1. Додайте цей код до проекту:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
  2. Вимкніть збірки серіалізації поколінь.

  3. Побудувати та виконати.

2

У мене був веб-додаток .NET 4.0, ASP.NET MVC 2.0, Entity Framework 4.0, розроблений у Visual Studio 2010. У мене була та ж проблема, що вона працювала на одному сервері Windows Server 2008 R2, але не на іншому сервері Windows Server 2008 R2, навіть незважаючи на те, що версії .NET і ASP.NET MVC були однаковими, викидаючи цю помилку, як і ваша.

Я пішов виконувати пропозицію miko, тому встановив Windows SDK v7.1 (x64) на збійний сервер, щоб я міг запустити! Dumpheap.

Ну, виявляється, що встановлення Windows SDK v7.1 (x64) вирішило проблему. Яка б залежність не була відсутня, повинна бути включена до SDK. Його можна завантажити з Microsoft Windows SDK для Windows 7 та .NET Framework 4 .


2

Додаю до цього мою конкретну проблему / рішення, оскільки це перший результат цього повідомлення про помилку. У моєму випадку помилка була отримана, коли я розгорнув другу програму в папці моєї першої програми в IIS . Обидва визначали рядок з'єднання з тим самим іменем, що призводило до виникнення конфлікту дочірньої програми і, в свою чергу, генерувало це (для мене) неочевидне повідомлення про помилку. Це було вирішено шляхом додавання:

<clear/>

у блоці рядків підключення дочірнього веб-додатку, який заважав йому успадковувати рядки з'єднання файлів web.config вище в ієрархії, так це виглядає так:

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

Питання щодо переповнення стека, яке допомогло, як тільки я визначив, що відбувається, - Чи отримає дочірнє додаток від його батьківського web.config? .


2

Це працювало для мене. Додайте його у свій web.config

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

Я отримав цю помилку: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

Якщо жоден з інших відповідей вам не допоможе:

Коли у мене виникла ця проблема, виявилося, що моя служба Windows була побудована для платформи x64, і я ненавмисно запустив 32-бітну версію InstallUtil.exe. Тому переконайтеся, що ви використовуєте правильну версію InstallUtil для платформи, для якої ви створили.


У мене було подібне питання. Деякі DLL, якими користувався мій сервіс, були складені для 32-бітного процесора, змінені на будь-який процесор і він працює зараз.
Блейк Thingstad

1

Інші пропозиції - це все добре. У моєму випадку проблема полягала в тому, що вікно розробника являло собою 64-бітну машину, яка використовувала розташування x86 різних API, включаючи Silverlight .

Змінивши цільову платформу, щоб вона відповідала 32-бітовому серверу, на якому розміщувався веб-додаток, видалила більшість помилок, пов’язаних із тим, що не вдалося завантажити один або кілька запитуваних типів.



1

У мене було те саме повідомлення про помилку, яке повідомлялося під час компіляції пакету Visual Studio (VSPackage). Все рішення компілюється, і помилка видається під час створення пакета CreatePkgDef. Сказавши це, зрозуміло, що я не можу зловити LoaderExceptions, оскільки це не моє додаток, яке кидає його, а власний інструмент Microsoft. (Хоча я відповідальний за плутанину CreatePkgDef.)

У моєму випадку першопричиною було те, що моє рішення створює MyDll.dll, який вже був зареєстрований у GAC (і вони різні), тому CreatePgkDef заплутався, який саме використовувати, і вирішив просто випустити помилку, яка не є ' т дійсно корисно. MyDll.dll в GAC був зареєстрований установщиком того ж продукту (очевидно, що це була більш рання версія, з / трохи / різним вмістом).

Як це виправити

  1. Бажаний спосіб. Переконайтеся, що ви використовуєте правильну версію MyDll.dll
    1. Складаючи проект, переконайтеся, що ви використовуєте інший номер версії, ніж ви використовували в попередній версії, розташованій у GAC. Переконайтесь, що такі атрибути є правильними:
      • [збірка: AssemblyVersion ("1.0.0.1")] // Припускаючи, що старий файл DLL був переоформлений 1.0.0.0
      • [збирання: AssemblyFileVersion ("1.0.0.1")] // Припускаючи, що старий файл DLL був перероблений 1.0.0.0
    2. Якщо потрібно, вкажіть повністю кваліфіковану назву збірки (наприклад, "MyDll.dll, версія = 1.0.0.1, культура = нейтральна, PublicKeyToken = 1234567890abcdef"), коли ви посилаєтесь на неї у своїх інших проектах.
  2. Якщо вищезгадане не вдалося: Ви можете видалити старий MyDll.dll з GAC
    1. Як видалити збірку з GAC
    2. Видаліть додаток, що включає MyDll.dll

Зміна AssemblyVersion для мене була досить хорошою. :)

Я сподіваюся, що це було корисно.


1

У мене була така ж проблема (але в моєму локальному), коли я намагався додати міграцію Entity Framework з консолі менеджера пакунків.

Я вирішив це шляхом створення консольної програми, де Main () мав такий код:

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

Переконайтеся, що клас конфігурації є конфігурацією міграції вашого невдалого проекту. Для використання DbMigrator вам знадобиться System.Data.Entity.Migrations.

Встановіть точку перерви у програмі та запустіть її. Виняток повинен спіймати Visual Studio (якщо у вас не встановлено тип винятку, щоб не порушувати сеанс налагодження), і ви повинні мати можливість знайти інформацію, яку шукаєте.

Відсутня посилання в моєму випадку була EFProviderWrapperToolkit.


1

У мене виникла ця проблема, коли я встановив пакет NuGet на одному з проектів і забув оновити інший проект.

Я вирішив це, просто зробивши обидва проекти, що мають однакову довідкову збірку.


Дякуємо за посилання! Я поняття не мав, що таке NuGet.
jebar8

1

Це сталося і для мене. Я вирішив проблему наступним чином: Клацніть правою кнопкою миші Рішення, Керуйте пакетами NuGet для вирішення ... Консолідуйте пакунки та оновіть пакети, щоб вони знаходилися в одній версії.


0

Встановіть 32-бітний режим IIS в true, в режимі налагодження - true у файлі конфігурації, видалення tempкаталогу та скидання IIS виправляє проблему тимчасово, і вона повертається через деякий час.


0

Переконайтеся, що кожен із ваших проектів налаштований правильно в Менеджері конфігурацій .

Подібно до причини цієї проблеми Вільяма Едмондсона , я переключив налаштування Менеджера конфігурацій з "Налагодження" "Будь-якого процесора" на "Налагодження". NET ". Проблема полягала в тому, що версія ".NET" НЕ була налаштована на створення ВСІХ проектів, тому деякі мої DLL застаріли (а інші були поточними). Це спричинило численні проблеми із запуском програми.

Тимчасове виправлення полягало в тому, щоб зробити пропозицію Кенні Еліассона очистити каталоги \ bin та \ obj. Однак, як тільки я вніс більше змін у проекти, що не складаються, все знову провалиться.


0

Я також отримав цю проблему, коли створював нову надбудову Microsoft Word за допомогою Visual Studio 2015. Проблема стосується того, що у мене є дві версії MS Office, 2013 та 2016. Я видаляю MS Office 2013, а потім вона працює.


0

Я будую кілька проектів для SharePoint і, звичайно, розгортаю їх. Одного разу це сталося.

Я знайшов стару збірку в C: \ Windows \ Assembly \ temp \ xxx (з FarManager), видалив її після перезавантаження та створив усі проекти.

У мене є питання щодо MSBuild, тому що на зборах проектів пов'язані як проекти, і кожна збірка позначена "Копіювати локально", але не від GAC.


0

Я можу виправити цю проблему, позначивши "Копіювати локально = Істинно" на всіх посилаються файлах DLL у проекті, відновивши та розгорнувши на тестовому сервері.


0

У мене виникла проблема з автоматикою. У binпапці файл automap.4net.dll був там, але чомусь automap.xml та automap.dll не були. Скопіювавши їх у binкаталог, вирішено проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.