Сообщение об ошибке "Невозможно загрузить один или несколько запрошенных типов. Получите свойство LoaderExceptions для получения дополнительной информации.'
Я разработал приложение с использованием 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, Dictionary
2& typesInLoading, List`1& error)в 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, ObjectParameter[])
В Entity Framework, похоже, есть проблема, есть какие-то подсказки, как это исправить?
38 ответов
Я решил эту проблему, установив для атрибута "Копировать локально" ссылок моего проекта значение true.
Эта ошибка не имеет истинного волшебного ответа. Ключ должен иметь всю информацию, чтобы понять проблему. Скорее всего, в динамически загруженной сборке отсутствует ссылка на сборку. Эта сборка должна находиться в каталоге 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.
}
Одно из решений, которое мне помогло, - удалить папки bin/ и obj/ и перестроить решение.
Два возможных решения:
- Вы компилируете в режиме Release, но развертываете старую скомпилированную версию из своего каталога Debug (или наоборот).
- У вас не установлена правильная версия.NET Framework в вашей тестовой среде.
Решением было проверить исключение LoaderException: в моем случае некоторые файлы DLL отсутствовали.
Как уже упоминалось ранее, это обычно тот случай, когда сборки там нет.
Чтобы точно знать, какая сборка вам не хватает, присоедините ваш отладчик, установите точку останова и, когда вы увидите объект исключения, перейдите к свойству LoaderExceptions. Недостающая сборка должна быть там.
Надеюсь, поможет!
Убедитесь, что вы разрешаете 32-разрядные приложения в IIS, если вы развернули IIS. Вы можете определить это в настройках вашего текущего пула приложений.
Я столкнулся с этой ошибкой в приложении ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4.
Это будет нормально работать на моей машине для разработки (Windows Vista 64-bit). Затем при развертывании на сервере ( Windows Server 2008 R2 с пакетом обновления 1) он будет работать до истечения времени ожидания сеанса. Таким образом, мы развернули приложение, и все выглядело нормально, а затем оставили его более чем на 20-минутный тайм-аут сеанса, после чего эта ошибка была бы выдана.
Чтобы решить эту проблему, я использовал этот код в блоге Кена Кокса для получения свойства LoaderExceptions.
В моей ситуации отсутствующая DLL была Microsoft.ReportViewer.ProcessingObjectModel
(версия 10). Эта DLL должна быть установлена в GAC компьютера, на котором выполняется приложение. Вы можете найти его в распространяемом пакете Microsoft Report Viewer 2010, доступном на сайте загрузки Microsoft.
Мой экземпляр этой проблемы оказался недостающей ссылкой. Сборка упоминалась в app.config, но не имела ссылки в проекте.
Если вы используете EntityDataSource в своем проекте, решение имеет следующее исправление: "Невозможно загрузить один или несколько запрошенных типов" Ошибки. Вы должны установить ContextTypeName="ProjectNameNameSpace.EntityContainerName" '
Это решило мои проблемы...
Сначала я попробовал программу просмотра журналов Fusion, но это не помогло, поэтому я в итоге использовал WinDbg с расширением SOS.
! dumpheap -stat -type Исключение /D
Затем я изучил FileNotFoundExceptions. Сообщение в исключении содержало имя DLL, которая не загружалась.
Обратите внимание, что /D дает вам результаты с гиперссылками, поэтому нажмите на ссылку в сводке для FileNotFoundException. Это выведет список исключений. Затем нажмите на ссылку для одного из исключений. Это будет! Dumpobject, что исключения. Тогда вы сможете просто щелкнуть ссылку "Сообщение" в объекте исключения, и вы увидите текст.
Другое решение, чтобы узнать, почему точно ничего не работает (от Microsoft Connect):
Добавьте этот код в проект:
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) { asm.GetTypes(); }
Отключить генерацию сериализации сборок.
- Построить и выполнить.
Если вы используете Entity Framework, попробуйте скопировать следующие ссылки локально.
- System.Data.Entity
- System.Web.Entity
Измените свойство "Копировать локально" на "Истина" для этих ссылок и опубликуйте.
Это сработало для меня. Добавьте его в свой web.config
<system.web>
<trust level="Full" />
У меня было.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.
Моя проблема была решена после того, как я удалил избыточные файлы сборки из bin
папка.
Если ни один из других ответов не поможет вам:
Когда у меня возникла эта проблема, оказалось, что моя служба Windows была создана для платформы x64, и я случайно запустил 32-разрядную версию InstallUtil.exe. Поэтому убедитесь, что вы используете правильную версию InstallUtil для платформы, для которой вы создали.
Добавление моей конкретной проблемы / решения к этому, поскольку это первый результат для этого сообщения об ошибке. В моем случае ошибка была получена, когда я развернул второе приложение в папке моего первого приложения в IIS. Оба определяли строку подключения с одинаковым именем, что приводило к конфликту дочернего приложения и, в свою очередь, генерировало это (для меня) неочевидное сообщение об ошибке. Это было решено путем добавления:
<clear/>
в блоке строки подключения дочернего веб-приложения, которое не позволяет ему наследовать строки подключения файлов web.config выше в иерархии, поэтому это выглядит так:
<connectionStrings>
<clear/>
<add name="DbContext" connectionString="MySERVER" providerName="System.Data.SqlClient" />
</connectionStrings>
Справочный вопрос переполнения стека, который помог мне, как только я определил, что происходит, будет наследовать ли дочернее приложение от родительского web.config?,
У меня была та же проблема (но на моем локальном компьютере), когда я пытался добавить миграцию Entity Framework с помощью консоли диспетчера пакетов.
Я решил это путем создания консольного приложения, в котором Main () имел следующий код:
var dbConfig = new Configuration();
var dbMigrator = new DbMigrator(dbConfig);
dbMigrator.Update();
Убедитесь, что класс Configuration является конфигурацией миграции вашего неудачного проекта. Вам понадобится System.Data.Entity.Migrations, чтобы использовать DbMigrator.
Установите точку останова в вашем приложении и запустите ее. Исключение должно быть перехвачено Visual Studio (если только у вас не установлен этот тип исключения, чтобы не прерывать сеанс отладки), и вы сможете найти искомую информацию.
В моем случае отсутствующей ссылкой был EFProviderWrapperToolkit.
Я получил эту проблему, когда я установил пакет NuGet на один из проектов и забыл обновить другой проект.
Я решил это, просто сделав оба проекта с одинаковой эталонной сборкой.
Я изменил Свойство Конкретной Версии Ссылок на false, и это помогло.
Другие предложения все хорошо. В моем случае проблема заключалась в том, что разработчик представлял собой 64-разрядную машину, использующую расположение x86 различных API, включая Silverlight.
Изменяя целевую платформу в соответствии с 32-разрядным сервером, на котором развертывалось веб-приложение, удалось устранить большинство ошибок, связанных с невозможностью загрузки одного или нескольких запрошенных типов.
У меня было такое же сообщение об ошибке при компиляции пакета Visual Studio (VSPackage). Все решение компилируется, и возникает ошибка при создании пакета CreatePkgDef. Сказав это, ясно, что я не могу поймать исключения LoaderException, поскольку это не мое приложение, которое выдает его, а собственный инструмент Microsoft. (Хотя я несу ответственность за путаницу CreatePkgDef.)
В моем случае основной причиной было то, что мое решение создает MyDll.dll, который уже был зарегистрирован в GAC (и они разные), поэтому CreatePgkDef запутался, какой использовать, и решил просто выдать ошибку, которая не ' очень полезно. MyDll.dll в GAC был зарегистрирован установщиком того же продукта (очевидно, более ранней версии, с / немного / другим содержанием).
Как это исправить
- Предпочтительный способ: убедитесь, что вы используете правильную версию MyDll.dll
- При компиляции проекта убедитесь, что вы используете номер версии, отличный от того, который вы использовали в предыдущей версии, расположенной в GAC. Убедитесь, что следующие атрибуты верны:
- [assembly: AssemblyVersion ("1.0.0.1")] // Предполагается, что старый DLL-файл имеет версию 1.0.0.0
- [assembly: AssemblyFileVersion ("1.0.0.1")] // Предполагается, что старый файл DLL имеет версию 1.0.0.0
- При необходимости укажите полное имя сборки (например, "MyDll.dll, версия =1.0.0.1, Culture= нейтральный, PublicKeyToken=1234567890abcdef"), когда вы ссылаетесь на него в других своих проектах.
- При компиляции проекта убедитесь, что вы используете номер версии, отличный от того, который вы использовали в предыдущей версии, расположенной в GAC. Убедитесь, что следующие атрибуты верны:
- Если вышеуказанное не удалось: Вы можете удалить старый MyDll.dll из GAC
- Как удалить сборку из GAC
- Удалите приложение, которое включает в себя MyDll.dll
Изменение AssemblyVersion было достаточно для меня.:)
Я надеюсь, что это было полезно.
Это случилось и со мной. Я решил проблему следующим образом: щелкните правой кнопкой мыши Решение, выберите Управление пакетами NuGet для решения... Консолидируйте пакеты и обновите пакеты до той же версии.
У меня была эта проблема при обращении к пакету nuget, а затем при использовании опции удаления, чтобы удалить его из моего проекта. Я должен был очистить папку bin после борьбы с проблемой в течение нескольких часов. Чтобы избежать этого, рекомендуется использовать nuget для удаления нежелательных пакетов, а не обычного удаления.
Установите для 32-разрядного режима IIS значение true, для режима отладки значение true в файле конфигурации, удалив temp
каталог и сброс IIS устраняет проблему временно, и она возвращается через некоторое время.
Убедитесь, что каждый из ваших проектов правильно настроен в Configuration Manager.
По аналогии с причиной этой проблемы Уильяма Эдмондсона, я переключил настройки Configuration Manager с "Отладка", "Любой ЦП" на "Отладка", ".NET". Проблема заключалась в том, что версия.NET НЕ была настроена для сборки ВСЕХ проектов, поэтому некоторые из моих DLL были устаревшими (в то время как другие были текущими). Это вызвало многочисленные проблемы с запуском приложения.
Временным решением было сделать предложение Кенни Элиассона очистить каталоги \bin и \obj. Тем не менее, как только я внесу дополнительные изменения в некомпилируемые проекты, все снова рухнуло.
В моем случае у меня был один пакет nuget, который был установлен в моем проекте, однако папка пакета никогда не регистрировалась в TFS, поэтому на сборочной машине отсутствовали файлы bin пакета nuget. И, следовательно, в производстве я получил эту ошибку. Мне пришлось сравнить папку bin по сравнению с производственной и моей локальной, тогда я обнаружил, какие dll отсутствуют, и обнаружил, что они принадлежат одному пакету nuget.
Я создал несколько проектов для SharePoint и, конечно же, развернул их. Однажды это случилось.
Я нашел старую сборку в C:\Windows\assembly\temp\xxx (с FarManager), удалил ее после перезагрузки и все проекты собрал.
У меня есть вопрос к MSBuild, потому что в сборках проектов, связанных как проекты, и каждая сборка помечена как "Копировать локально", но не из GAC.
У меня была проблема с автоматом. в bin
папка, файл automap.4net.dll был там, но по какой-то причине не было automap.xml и automap.dll. Копирование их в bin
справочник решил проблему.