Сообщение об ошибке «Невозможно загрузить один или несколько запрошенных типов. Получите свойство 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 (сборка сборки, логическое loadReferencedAssemblies, словарь 2 knownAssemblies, Dictionary2 & typesInLoading, List`1 & ошибки)

в System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache (ObjectItemCollection objectItemCollection, сборка сборки, логическая загрузка loadReferencedAssemblies)

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

в System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType (Тип типа, Сборка, вызывающая сборку)

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

У Entity Framework, похоже, есть проблема, есть какие-то подсказки, как это исправить?


Не существует волшебной пули для решения этой проблемы, но этот ответ поможет вам узнать точную причину stackoverflow.com/a/8824250/185022
AZ_

Ответы:


105

Я решил эту проблему, установив для атрибута «Копировать локально» ссылок моего проекта значение true.


33
Когда мы продолжаем детализировать внутренние исключения, пока не увидим исключение типа ReflectionTypeLoadException и оно имеет свойство «LoaderExceptions», которое предоставляет информацию об отсутствующих или несоответствующих данных DLL. Тогда мы можем позаботиться о соответствующих действиях оттуда.
Сай

19
хорошо, когда вы отлаживаете в Visual Studio. Но как быть, если вы веб-приложение только выдаете эту ошибку на рабочий сервер? даже после того, как вы установили для атрибута «Копировать локально» значение true.
Юси

2
Это решение проблемы на рабочем сервере, а не в локальной Visual Studio. Copy Local копирует указанную DLL во время сборки, и сначала выполняется поиск DLL в той же папке, что и запущенное приложение. Проблема может сохраняться, если вы не скопировали DLL, скопированную во время сборки, в правильную папку на рабочем сервере.
Ментолипт

В моем случае мне пришлось также добавить ссылку на
nuget

530

Эта ошибка не имеет истинного волшебного ответа. Ключ должен иметь всю информацию, чтобы понять проблему. Скорее всего, в динамически загруженной сборке отсутствует ссылка на сборку. Эта сборка должна находиться в каталоге bin вашего приложения.

Используйте этот код, чтобы определить, чего не хватает.

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.
Боги Ленвиг,

4
Если бы я мог голосовать против каждый раз, когда я возвращаюсь к этому ответу, у него было бы еще около 5 голосов ... и
считал

2
Вы спасли мою жизнь. Огромное спасибо. Я НИКОГДА не нашел бы проблему. Это была какая-то старая dll, которую я больше не использовал, скрывающаяся глубоко в структуре моего проекта и вызывающая эту проблему.
Ричард

4
просто чтобы быстро выяснить, чего не хватает, пользуйтесь throw new Exception(errorMessage);, надеюсь, кому-то поможет.
Шайют

2
Без какого-либо дополнительного кода в Visual Studio перейдите в «Настройки исключений» и вставьте в поле поиска TypeLoadException, а затем установите флажки для пары совпадений. Также вам, возможно, придется отключить опции в разделе отладки «Просто мой код», чтобы вы могли отловить исключение, когда происходит зависимость, которую вы не написали.
Дэвид Бург

56

Одно из решений, которое мне помогло, - удалить папки bin / и obj / и перестроить решение.


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

4
Еще один комментарий: щелкните правой кнопкой мыши узел Solution в «Solution Explorer» и выберите «Clean Solution», затем нажмите «Rebuild Solution». (Если есть новое дополнение в вашем исходном проекте - другие проекты в вашем решении - часть (и), это приводит к тому, что изменения должны быть отражены в вашей папке dll проекта и решает эту проблему)
Эмре Гулдоган,

У меня была эта проблема. Как и было предложено, я закрыл Visual Studio, папку «Удаленный бен», заново открыл проект и перестроил, и он был успешным.
Сагар С.

Это происходило, когда я переключался между ветвями со значительными изменениями. Удаление корзины сработало. Очистка и восстановление не работали.
Дж. Г. Тейлор

33

Два возможных решения:

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

У меня была такая же проблема, пункт 1 был точным для меня. Спасибо Уильям.
Мэтью

У меня та же проблема ... Я прошел оба эти предложения и все еще получаю ту же ошибку :(
Дэвид Кифф

Это также может произойти, если указанная вами DLL-библиотека «заблокирована». Щелкните правой кнопкой мыши и выберите «разблокировать»
Бен

3
Также обнаружилось, что это происходит, если один из проектов DLL был настроен на сборку «x64» вместо «Any CPU».
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-bit). Затем при развертывании на сервере ( Windows Server 2008 R2 SP1) он будет работать до истечения времени ожидания сеанса. Таким образом, мы развернули приложение, и все выглядело нормально, а затем оставили его более чем на 20-минутный тайм-аут сеанса, после чего эта ошибка была бы выдана.

Чтобы решить эту проблему, я использовал этот код в блоге Кена Кокса для получения свойства LoaderExceptions.

Для моей ситуации отсутствующая DLL была Microsoft.ReportViewer.ProcessingObjectModel(версия 10). Эта DLL должна быть установлена ​​в GAC компьютера, на котором выполняется приложение. Вы можете найти его в распространяемом пакете Microsoft Report Viewer 2010, доступном на сайте загрузки Microsoft.


5

Сначала я попробовал программу просмотра журнала Fusion, но это не помогло, поэтому я в итоге использовал WinDbg с расширением SOS.

! dumpheap -stat -type Исключение / D

Затем я изучил FileNotFoundExceptions. Сообщение в исключении содержало имя DLL, которая не загружалась.

Обратите внимание, что / D дает вам результаты с гиперссылками, поэтому нажмите на ссылку в сводке для FileNotFoundException. Это выведет список исключений. Затем нажмите на ссылку для одного из исключений. Это будет! Dumpobject, что исключения. Тогда вы сможете просто щелкнуть ссылку «Сообщение» в объекте исключения, и вы увидите текст.



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 были одинаковыми, выдает ту же ошибку, что и ваша.

Я пошел по совету Мико , поэтому я установил 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

Моя проблема была решена после того, как я удалил избыточные файлы сборки из binпапки.


2

В случае, если ни один из других ответов не поможет вам:

Когда у меня возникла эта проблема, оказалось, что моя служба Windows была создана для платформы x64, и я случайно запустил 32-разрядную версию InstallUtil.exe. Поэтому убедитесь, что вы используете правильную версию InstallUtil для платформы, для которой вы создали.


У меня была похожая проблема. Некоторые из тех библиотек, которые использовал мой сервис, были скомпилированы для 32-битного процессора, заменены на любой процессор, и теперь он работает.
Блейк Тингстад

1

Другие предложения все хорошо. В моем случае проблема заключалась в том, что ящик разработчика представлял собой 64-разрядную машину, использующую расположение x86 различных API, включая Silverlight .

Изменяя целевую платформу в соответствии с 32-разрядным сервером, на котором развертывалось веб-приложение, удалось устранить большинство ошибок, связанных с невозможностью загрузки одного или нескольких запрошенных типов.



1

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

В моем случае основной причиной было то, что мое решение создает MyDll.dll, который уже был зарегистрирован в GAC (и они разные), поэтому CreatePgkDef запутался, какой использовать, и решил просто выдать ошибку, которая не ' очень полезно. MyDll.dll в GAC был зарегистрирован установщиком того же продукта (очевидно, более ранней версии, с / немного / другим содержанием).

Как это исправить

  1. Предпочтительный способ: убедитесь, что вы используете правильную версию MyDll.dll
    1. При компиляции проекта убедитесь, что вы используете номер версии, отличный от того, который вы использовали в предыдущей версии, расположенной в GAC. Убедитесь, что следующие атрибуты верны:
      • [assembly: AssemblyVersion ("1.0.0.1")] // Предполагается, что старый файл DLL имеет версию 1.0.0.0
      • [assembly: AssemblyFileVersion ("1.0.0.1")] // Предполагается, что старый файл DLL имеет версию 1.0.0.0
    2. При необходимости укажите полное имя сборки (например, «MyDll.dll, версия = 1.0.0.1, Culture = нейтральный, 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();

Убедитесь, что класс Configuration является конфигурацией миграции вашего неудачного проекта. Вам понадобится System.Data.Entity.Migrations, чтобы использовать DbMigrator.

Установите точку останова в вашем приложении и запустите ее. Исключение должно быть перехвачено Visual Studio (если только у вас не установлен этот тип исключения, чтобы не прерывать сеанс отладки), и вы сможете найти искомую информацию.

В моем случае отсутствующей ссылкой был EFProviderWrapperToolkit.


1

Я получил эту проблему, когда я установил пакет NuGet на один из проектов и забыл обновить другой проект.

Я решил это, просто сделав оба проекта с одной и той же эталонной сборкой.


Спасибо за ссылку! Я понятия не имел, что такое NuGet.
jebar8

1

Это случилось и со мной. Я решил проблему следующим образом: щелкните правой кнопкой мыши Решение, выберите Управление пакетами NuGet для решения ... Консолидируйте пакеты и обновите пакеты до той же версии.


0

Установите для 32-разрядного режима IIS значение true, для режима отладки значение true в файле конфигурации, удаление tempкаталога и сброс IIS временно устраняют проблему и возвращаются через некоторое время.


0

Убедитесь, что каждый из ваших проектов правильно настроен в Configuration Manager .

По аналогии с причиной этой проблемы Уильяма Эдмондсона , я переключил настройки Configuration Manager с «Отладка», «Любой процессор» на «Отладка», «.NET». Проблема заключалась в том, что версия .NET НЕ была настроена для сборки ВСЕХ проектов, поэтому некоторые из моих DLL были устаревшими (в то время как другие были текущими). Это вызвало многочисленные проблемы с запуском приложения.

Временным решением было сделать предложение Кенни Элиассона очистить каталоги \ bin и \ obj. Тем не менее, как только я внесу больше изменений в некомпилируемые проекты, все снова рухнуло.


0

Я также получил эту проблему при создании новой надстройки Microsoft Word с Visual Studio 2015. Проблема заключается в том, что у меня есть 2 версии MS Office, 2013 и 2016. Я удаляю MS Office 2013, и затем он работает.


0

Я создал несколько проектов для SharePoint и, конечно же, развернул их. Однажды это случилось.

Я нашел старую сборку в C: \ Windows \ assembly \ temp \ xxx (с FarManager), удалил ее после перезагрузки и все проекты собрал.

У меня вопрос к MSBuild, потому что в сборках проектов, связанных как проекты, и каждая сборка помечается как «Копировать локально», но не из GAC.


0

Я могу решить эту проблему, отметив «Копировать локально = True» на всех ссылочных файлах DLL в проекте, перестроив и развернув на тестовом сервере.


0

У меня была проблема с автоматом. В binпапке был файл automap.4net.dll, но по какой-то причине не было automap.xml и automap.dll. Копирование их в binкаталог решило проблему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.