Вопрос по c#, entity-framework – Сообщение об ошибке «Невозможно загрузить один или несколько запрошенных типов. Получите свойство LoaderExceptions для получения дополнительной информации. '

302

Я разработал приложение, используяEntity Framework, SQL Server 2000, Visual & # xA0; Studio & # xA0; 2008 и Enterprise Library.

Локально работает абсолютно нормально, но когда я развертываю проект в нашей тестовой среде, я получаю следующую ошибку:

Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information

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

at System.Reflection.Assembly.GetTypes()

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly(LoadingContext context)

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache(LoadingContext context)

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache(Assembly assembly, Boolean loadReferencedAssemblies, Dictionary2 knownAssemblies, Dictionary2& typesInLoading, List`1& errors)

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

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

at System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType(Type type, Assembly callingAssembly)

at System.Data.Objects.ObjectContext.CreateQuery[T](String queryString, ObjectParameter[] parameters)

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

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

Ваш Ответ

30   ответов
95

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

хорошо, это нормально, когда вы отлаживаете в Visual Studio. Но как быть, если веб-приложение выдает эту ошибку только на производственном сервере? даже после того, как вы установили для атрибута Копировать локальное значение true
Это решение проблемы на рабочем сервере, а не в локальной Visual Studio. Copy Local копирует указанную DLL во время сборки, и сначала выполняется поиск DLL в той же папке, что и запущенное приложение. Проблема может сохраняться, если вы не скопировали DLL, скопированную во время сборки, в правильную папку на рабочем сервере.
Когда мы продолжаем детализировать внутренние исключения, пока не увидим исключение типа ReflectionTypeLoadException и оно имеет свойство & quot; LoaderExceptions & quot; которые дают информацию об отсутствующей или несоответствующей информации DLL. Тогда мы можем позаботиться о соответствующих действиях оттуда.
47

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

Еще один комментарий: щелкните правой кнопкой мыши узел Solution в & quot; Solution Explorer & quot; и нажмите «Очистить решение», затем нажмите «Восстановить решение». (Если есть новое дополнение в вашем исходном проекте - другие проекты в вашем решении - часть (и), это приводит к тому, что изменения должны быть отражены в вашей папке dll проекта и решает эту проблему)
Это происходило, когда я переключался между ветвями со значительными изменениями. Удаление корзины сработало. Очистка и восстановление не работали.
У меня была эта проблема. Как и было предложено, я закрыл Visual Studio, папку «Удаленный бен», заново открыл проект и перестроил, и он был успешным.
Мне пришлось пересобрать сам тестовый проект, но я не уверен, что вы ссылаетесь на тестовый проект здесь или на проект, который вы тестируете.
2

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

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

Error: User Rate Limit Exceeded
1

Я изменил Свойство Конкретной Версии Ссылок на false, и это помогло.

0

Я могу решить эту проблему, отметив & quot; Copy Local = True & quot; на всех ссылочных DLL-файлах в проекте, перестроение и развертывание на тестовом сервере.

4

Решением было проверить исключение LoaderException: в моем случае некоторые файлы DLL отсутствовали.

Enter image description here

0

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

5

Убедитесь, что вы разрешаете 32-битные приложения наIIS если вы развернули в IIS. Вы можете определить это в настройках вашего текущего пула приложений.

1

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

481

Эта ошибка не имеет истинного магического ответа Ключ должен иметь всю информацию, чтобы понять проблему. Скорее всего, в динамически загруженной сборке отсутствует ссылка на сборку. Эта сборка должна находиться в каталоге 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.
}
Спасибо! Это должно быть частью любой настройки регистрации в системах, которые используют MEF.
Спасибо, это помогло мне. Но по какой-то причине (в моем случае есть многоуровневые исключения) строка в приведенном выше коде & quot; catch (ReflectionTypeLoadException ex) & quot; не работал для меня, но я мог видеть этот тип исключения в моих InnerExceptions (ReflectionTypeLoadException), и я мог выяснить информацию DLL несоответствия из LoaderExceptions.
Вы спасли мою жизнь. Огромное спасибо. Я НИКОГДА не нашел бы проблему. Это была какая-то старая библиотека, которую я больше не использовал, скрывающаяся глубоко в структуре моего проекта и вызывающая эту проблему.
просто чтобы быстро выяснить, чего не хватает, используйтеthrow new Exception(errorMessage);Надежда помогает кому-то.
Если бы я мог голосовать против каждый раз, когда я возвращаюсь к этому ответу, у меня было бы еще около 5 голосов ... и считал
1

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

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

32

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

  1. You are compiling in Release mode but deploying an older compiled version from your Debug directory (or vise versa).
  2. You don't have the correct version of the .NET Framework installed in your test environment.
У меня такая же проблема ... Я прошел через оба предложения и все еще получаю ту же ошибку :(
Это также может произойти, если указанная вами DLL-библиотека «заблокирована». Щелкните правой кнопкой мыши на нем и выберите «разблокировать»
У меня была та же проблема, пункт 1 был точным для меня. Спасибо Уильям.
# 1 может возникнуть, если конфигурация решения неверна - проект не выбран для сборки, например, после удаления и повторного добавления проекта в решение
Также обнаружилось, что это произошло, если один из проектов DLL был настроен на сборку & quot; x64 & quot; вместо "Любой процессор".
0

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

4

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

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

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

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

0

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

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

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

0

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

6

Я столкнулся с этой ошибкой с ASP.NET 4 +SQL Server 2008 R2 +Entity Framework 4 приложения.

Это будет нормально работать на моей машине для разработки (Windows & # xA0; Vista, 64-bit). Затем при развертывании на сервере (Windows Server 2008 R2 SP1), он будет работать до истечения времени ожидания сеанса. Поэтому мы развернули приложение, и все выглядело нормально, а затем оставили его более чем на 20-минутный тайм-аут сеанса, после чего эта ошибка была бы выдана.

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

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

0

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

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

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

2

Это сработало для меня. Добавьте его в свой web.config

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

У меня был .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.

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

Если вы используетеEntity FrameworkПопробуйте скопировать следующие ссылки локально.

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

Измените свойство & quot; Копировать локальное & quot; на "True" по этим ссылкам и публикуем.

5

Если вы используете EntityDataSource в своем проекте, решение находится вИсправлено: «невозможно загрузить один или несколько запрошенных типов»; ошибки, Вы должны установить ContextTypeName = & quot; ProjectNameNameSpace.EntityContainerName & quot; & APOS;

Это решило мои проблемы ...

1

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

0

I had the same error message reported when compiling a Visual Studio package (VSPackage). Все решение компилируется, и ошибка создается при создании пакета CreatePkgDef. Сказав это, ясно, чтоI cannot catch the LoaderExceptions поскольку это не мое приложение, которое бросает это, но собственный инструмент Microsoft. (Хотя я несу ответственность за путаницу CreatePkgDef.)

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

How to fix it

  1. Preferred way: Make sure you use the correct version of MyDll.dll
    1. When compiling your project make sure you use a different version number than you used in the previous version located in the GAC. Make sure the following attributes are correct:
      • [assembly: AssemblyVersion("1.0.0.1")] // Assuming the old DLL file was versioned 1.0.0.0
      • [assembly: AssemblyFileVersion("1.0.0.1")] // Assuming the old DLL file was versioned 1.0.0.0
    2. If needed, specify the fully qualified assembly name (for example, "MyDll.dll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=1234567890abcdef") when you reference it in your other projects.
  2. If the above failed: You can uninstall the old MyDll.dll from GAC
    1. How to Uninstall an Assembly from the GAC
    2. Uninstall the application that includes MyDll.dll

Изменение AssemblyVersion было достаточно для меня. :)

Я надеюсь, что это было полезно.

2

Добавление моей конкретной проблемы / решения к этому, поскольку это первый результат для этого сообщения об ошибке. В моем случае ошибка была получена, когда я развернул второе приложение в папке моего первого приложения вIIS, Оба определяли строку подключения с одинаковым именем, что приводило к конфликту дочернего приложения и в свою очередь создавало это (для меня) неочевидное сообщение об ошибке. Это было решено путем добавления:

<clear/>

в блоке строки подключения дочернего веб-приложения, которое не позволяет ему наследовать строки подключения файлов web.config выше в иерархии, поэтому это выглядит так:

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

Справочный вопрос переполнения стека, который помог, как только я определил, что было происходит былоБудет ли дочернее приложение наследоваться от родительского web.config?.

3

Другое решение, чтобы узнать, почему точно ничего не работает (от Microsoft Connect):

  1. Add this code to the project:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
    
  2. Turn off generation serialization assemblies.

  3. Build and execute.
11

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

Чтобы точно знать, какая сборка вам не хватает, присоедините ваш отладчик, установите точку останова, и, когда вы увидите объект исключения, перейдите к параметру & apos; LoaderExceptions & apos; имущество. Недостающая сборка должна быть там.

Надеюсь, поможет!

В решении с несколькими проектами, как мы видим, какой проект вызывает проблему в LoaderExceptions? Я вижу, что System.Web.Mvc не может быть найден, но я не знаю, какой из 20 проектов в этом решении может иметь проблемы.
Также мы можем продолжать детализировать внутренние исключения, пока не увидим исключение типа ReflectionTypeLoadException и оно имеет свойство & quot; LoaderExceptions & quot; который дает информацию об отсутствующей или несоответствующей информации DLL.
1

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

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

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

Мой экземпляр этой проблемы оказался недостающей ссылкой. Сборка была упомянута в app.config, но не имела ссылки в проекте.

Похожие вопросы