Не удалось загрузить тип 'System.Runtime.CompilerServices.ExtensionAttribute' из сборки 'mscorlib
При первом запуске моего сайта я получаю эту ошибку
Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Что я делаю неправильно?
Я использую.NET 4 и запускаю сайт из Visual Studio.
Единственное, что я недавно изменил, - это добавление Simple Injector (через Nuget) в мой проект.
Вот трассировка стека
[TypeLoadException: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.]
System.ModuleHandle.ResolveType(RuntimeModule module, Int32 typeToken, IntPtr* typeInstArgs, Int32 typeInstCount, IntPtr* methodInstArgs, Int32 methodInstCount, ObjectHandleOnStack type) +0
System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule module, Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext) +180
System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) +192
System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord, MetadataImport scope, Assembly& lastAptcaOkAssembly, RuntimeModule decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, Object[] attributes, IList derivedAttributes, RuntimeType& attributeType, IRuntimeMethodInfo& ctor, Boolean& ctorHasParameters, Boolean& isVarArg) +115
System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes, Boolean isDecoratedTargetSecurityTransparent) +426
System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeAssembly assembly, RuntimeType caType) +103
System.Reflection.RuntimeAssembly.GetCustomAttributes(Type attributeType, Boolean inherit) +64
WebActivator.AssemblyExtensions.GetActivationAttributes(Assembly assembly) +132
WebActivator.ActivationManager.RunActivationMethods() +216
WebActivator.ActivationManager.RunPreStartMethods() +43
WebActivator.ActivationManager.Run() +69
[InvalidOperationException: The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'..]
System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +423
System.Web.Compilation.BuildManager.CallPreStartInitMethods() +306
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +677
[HttpException (0x80004005): The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'..]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9090876
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +258
Первая строка всех видов подсвечивается, и при наведении на них появляется эта ошибка
The pre-application start initialisation method Run on type WebActivator.ActivationManager threw an exception with the following error message Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
11 ответов
Не удалось загрузить тип 'System.Runtime.CompilerServices.ExtensionAttribute' из сборки mscorlib
Да, технически это может пойти не так, когда вы выполняете код в.NET 4.0 вместо.NET 4.5. Атрибут был перемещен из System.Core.dll в mscorlib.dll в.NET 4.5. Хотя это звучит как довольно неприятное критическое изменение в версии платформы, которая должна быть на 100% совместимой, атрибут [TypeForwardedTo] должен сделать это различие ненаблюдаемым.
Как сказал бы Мерфи, каждое хорошо спланированное изменение, подобное этому, имеет по крайней мере один режим отказа, о котором никто не думал. Это кажется неправильным, когда ILMerge использовался для объединения нескольких сборок в одну, и этот инструмент использовался неправильно. Хорошая статья обратной связи, которая описывает эту поломку здесь. Он ссылается на сообщение в блоге, которое описывает ошибку. Это довольно длинная статья, но если я правильно ее интерпретирую, то неправильная опция командной строки ILMerge вызывает эту проблему:
/targetplatform:"v4,c:\windows\Microsoft.NET\Framework\v4.0.30319"
Что неверно. Когда вы устанавливаете 4.5 на компьютер, на котором собрана программа, сборки в этом каталоге обновляются с 4.0 до 4.5 и больше не подходят для целевой версии 4.0. Этих сборок действительно не должно быть больше, но они были сохранены по соображениям совместимости. Надлежащие эталонные сборки - это эталонные сборки 4.0, хранящиеся в другом месте:
/targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
Таким образом, возможные обходные пути - вернуться к версии 4.0 на машине сборки, установить.NET 4.5 на целевой машине и реальное исправление, пересобрать проект из предоставленного исходного кода, исправив команду ILMerge.
Обратите внимание, что этот режим отказа не является эксклюзивным для ILMerge, это просто очень распространенный случай. Любой другой сценарий, в котором эти сборки 4.5 используются в качестве эталонных сборок в проекте, нацеленном на 4.0, может привести к сбою таким же образом. Судя по другим вопросам, другой распространенный режим отказа - это серверы сборки, которые были настроены без использования действующей лицензии VS. И не обращая внимания на то, что пакеты с множественным таргетингом можно скачать бесплатно.
Использование эталонных сборок в подкаталоге c:\program files (x86) является непростым требованием. Начиная с.NET 4.0, уже важно избегать случайной зависимости от класса или метода, добавленных в выпусках 4.01, 4.02 и 4.03. Но абсолютно необходимо сейчас, когда выйдет 4.5.
У меня была эта проблема, кроме типа, который он не мог загрузить, был System.Reflection.AssemblyMetadataAttribute. Веб-приложение было построено на компьютере с установленным.NET 4.5 (там работает нормально), с 4.0 в качестве целевой платформы, но ошибка появилась, когда оно было запущено на веб-сервере с установленной только 4.0. Затем я попробовал это на веб-сервере с установленным 4.5, и не было никакой ошибки. Итак, как уже говорили другие, это все из-за того, что Microsoft выпустила 4.5, которая в основном является обновлением (и перезаписью) версии 4.0. Сборка System.Reflection ссылается на тип, который не существует в 4.0 (AssemblyMetadataAttribute), поэтому произойдет сбой, если у вас нет новой System.Reflection.dll.
Вы можете установить.NET 4.5 на целевом веб-сервере или создать приложение на компьютере, на котором не установлено 4.5. Далеко от идеального разрешения.
У меня была точно такая же проблема с сайтом (Kentico CMS), я начал разработку в 4.5, обнаружил, что рабочий сервер поддерживает только 4.0, попытался вернуться к целевой среде 4.0. Компиляция других постов в этой теме (в частности, изменение целевой платформы на.Net 4 и.Net 4.5, на которые все еще ссылаются). Я искал свое решение и обнаружил, что несколько пакетов NuGet все еще используют библиотеки с targetFramework = "net45".
packages.config (before):
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AutoMapper" version="3.1.0" targetFramework="net45" />
<package id="EntityFramework" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.0.0" targetFramework="net45" />
<package id="Newtonsoft.Json" version="4.5.11" targetFramework="net45" />
</packages>
Я изменил целевую платформу проектов обратно на 4.5, удалил все библиотеки NuGet, вернулся к 4.0 и заново добавил библиотеки (пришлось использовать некоторые предыдущие версии, которые не зависели от 4.5).
packages.config (after):
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AutoMapper" version="3.1.1" targetFramework="net40" />
<package id="EntityFramework" version="6.0.2" targetFramework="net40" />
<package id="Microsoft.AspNet.WebApi.Client" version="4.0.30506.0" targetFramework="net40" />
<package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net40" />
<package id="Newtonsoft.Json" version="4.5.11" targetFramework="net40" />
</packages>
Я только что столкнулся с этой досадной проблемой сегодня. Мы используем SmartAssembly для упаковки / обфускации наших сборок.NET, но неожиданно конечный продукт не работает на наших тестовых системах. Я даже не думал, что у меня есть.NET 4.5, но, видимо, что-то установило его около месяца назад.
Я удалил 4.5 и переустановил 4.0, и теперь все снова работает. Не слишком впечатлен тем, что унес это на полдня.
Я столкнулся с той же проблемой при попытке прочитать данные из базы данных Firebird. После многих часов поиска я обнаружил, что проблема была вызвана ошибкой, которую я сделал в запросе. Исправление заставило это работать отлично. Это никак не связано с версией Framework
Мы столкнулись с этой проблемой и отследили ее до пакета Geocoding.net NuGet, который мы использовали, чтобы помочь с нашими представлениями в Картах Google (Geocoding.net версия 3.1.0, опубликованная 4/4/2014).
DLL геокодирования выглядит как.Net 4.0, когда вы изучаете файл пакета или просматриваете его с помощью приложения Jet Brains Dot Peek; однако, мой коллега говорит, что он был скомпилирован с использованием ilmerge, поэтому он, скорее всего, связан с перечисленными выше проблемами ilmerge.
Это был долгий процесс, чтобы выследить это. Мы выбирали разные наборы изменений из TFS, пока не сузили их до набора изменений, который добавил вышеупомянутый пакет NuGet. После его удаления мы смогли развернуть наш сервер.NET 4.
В моем случае после перехода с.NET 4.5 на.NET 4.0 проект работал нормально на локальной машине, но после публикации на сервере произошел сбой.
Оказывается, что у места назначения было несколько старых сборок, которые все еще ссылались на.NET 4.5.
Исправлено, включив опцию публикации "Удалить все существующие файлы перед публикацией"
В моем случае у меня была проблема с использованием Microsoft.ReportViewer.WebForms. Я удалил validate=true из add verb
строка в web.config и она начала работать:
<system.web>
<httpHandlers>
<add verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
Просто добавив этот ответ, чтобы помочь Google сэкономить немного времени, которое я потратил, чтобы добраться сюда. Я использовал ILMerge в своем проекте.Net 4.0 без установленного параметра /targetplatform, предполагая, что он будет правильно обнаружен в моей основной сборке. У меня тогда были жалобы от пользователей только на Windows XP или WinXP. Теперь это имеет смысл, поскольку в XP никогда не будет установлено> .Net 4.0, тогда как в большинстве новых ОС. Так что, если у ваших пользователей XP возникают проблемы, посмотрите исправления выше.
В моем случае, это был Blend SDK, пропущенный на машине TeamCity. Это вызвало ошибку из-за неправильного способа разрешения сборки.
AppendTargetFrameworkToOutputPath false
Другой крайний случай ...
Если вы используете
AppendTargetFrameworkToOutputPath
свойство и установив значение false, а затем скопировав несколько сборок, предназначенных для разных платформ, вы можете получить это сообщение. По сути, зависимости фреймворка конфликтуют.
использовать
AppendTargetFrameworkToOutputPath true
(или просто удалите) или убедитесь, что все модули вывода ориентированы на одну и ту же платформу.