Не удалось загрузить тип 'System.Runtime.CompilerServices.ExtensionAttribute' из сборки 'mscorlib


145

При первом запуске моего сайта я получаю эту ошибку

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'.

1
Нам нужно больше контекста о том, где вы начинаете свой веб-сайт и как. Вы определенно используете .NET 4 / 4.5?
— Джон Скит

1
NB: если у кого-то наблюдаются те же симптомы при выводе с вашего сервера сборки, проверьте наличие у вас эталонных сборок .net 4.0, после установки .net 4.5 вам нужно будет скопировать их из своего блока разработчика. Они , как правило , где - то так: C: \ Program Files (x86) \ Ссылка Сборки \ Microsoft \ Framework \ .NETFramework \ v4.0 Для получения более подробной информации см marcgravell.blogspot.co.nz/2012/09/...
— Myster

1
Я только что видел похожую проблему с DLL-библиотекой .NET 4.5, используемой в качестве плагина для Microsoft Dynamics CRM 2011 на машине, на которой была только .NET 4.0. Вместо того, чтобы просто отклонить его полностью, он зарегистрировал его, а затем полностью нарушил настройку рабочего процесса (плагин содержал пользовательское действие рабочего процесса). Трассировка показала, что он не может найти ExtensionAttribute в mscorlib, привела меня сюда, перестроила его для .NET 4.0 и проблема решена! Мысль, что следует упомянуть для будущего Google-фу.
— Мэтью Уолтон

Ответы:


262

Не удалось загрузить тип '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.


31
Какой превосходный ответ.
— Сачин Каинт

6
У меня все те же симптомы, но я не использую ILMerge, есть какие-то улики? Здесь вы можете найти Stacktrace. .umbraco.org/ issue/ U4-1708 , это может быть сторонняя DLL или DLL, но как мне ее найти?
— Myster

3
Примечание: у вас может не быть папки «C: \ Program Files \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0» в случае 64-битных версий Windows, в этом случае проверьте, есть ли у вас «C: \ Program» Папка Files (x86) \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0 ".
— Мартен Доктер

3
Я не установил ILMerge, и у меня есть эта проблема, так как я могу это исправить? Нужно ли устанавливать .net 4.5 на целевой сервер?
— TamarG

4
Меня удивляет, почему все настаивают на том, что это то, что MS должна решить. Они не будут, они не могут починить ваши сломанные проекты или собрать серверы. Используйте правильные эталонные сборки, проблема решена.
— Ганс Пассант

9

У меня была эта проблема, кроме типа, который он не мог загрузить, был 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. Далеко от идеального разрешения.


8

У меня была точно такая же проблема с сайтом (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>

5

Я только что столкнулся с этой досадной проблемой сегодня. Мы используем SmartAssembly для упаковки / обфускации наших сборок .NET, но неожиданно конечный продукт не работает на наших тестовых системах. Я даже не думал, что у меня есть .NET 4.5, но, видимо, что-то установило его около месяца назад.

Я удалил 4.5 и переустановил 4.0, и теперь все снова работает. Не слишком впечатлен тем, что унес это на полдня.


Заранее предупреждаю за вас, ДАЖЕ ЕСЛИ вы решите проблему в противном случае, ваша обфусцированная версия будет снова взломана, поэтому вы никогда не узнаете, что решили ее. Таким образом, вы МОЖЕТЕ построить на 4.5 и без проблем развернуть на машинах только с 4.0. Все, что мне было нужно, - это патч для многоцелевого использования, который упоминает Ганс Пассант. Посмотрев на манифест в ILDASM, я понял, что он правильно нацелен на System.Core, а не на mscorlib. Но НЕ в той версии, которая была запущена через SmartAssembly (v5.5).
— Джош Саттерфилд

4

Я столкнулся с той же проблемой при попытке прочитать данные из базы данных Firebird. После многих часов поиска я обнаружил, что проблема была вызвана ошибкой, которую я сделал в запросе. Исправление заставило это работать отлично. Это никак не связано с версией Framework


чувак, спасибо, я столкнулся с той же проблемой, как вы это исправили?
— Бенни

3

Мы столкнулись с этой проблемой и отследили ее до пакета Geocoding.net NuGet , который мы использовали, чтобы помочь с нашими представлениями Google Maps (версия Geocoding.net 3.1.0, опубликованная 2/4/2014).

DLL геокодирования выглядит как .Net 4.0, когда вы изучаете файл пакета или просматриваете его с помощью приложения Jet Brains Dot Peek; однако, мой коллега говорит, что он был скомпилирован с использованием ilmerge, так что он, скорее всего, связан с перечисленными выше проблемами ilmerge.

Это был долгий процесс, чтобы выследить это. Мы выбирали разные наборы изменений из TFS, пока не сузили их до набора изменений, который добавил вышеупомянутый пакет NuGet. После его удаления мы смогли развернуть наш сервер .NET 4.


В нашем случае проблема была вызвана Quartz.NET v2.3. Обновление до версии 2.3.2 решило проблему.
— Головокружение

2

В моем случае после перехода с .NET 4.5 на .NET 4.0 проект работал нормально на локальном компьютере, но не работал на сервере после публикации.

Оказывается, что у места назначения было несколько старых сборок, которые все еще ссылались на .NET 4.5.

Исправлено, включив опцию публикации «Удалить все существующие файлы перед публикацией»


1

В моем случае это был Blend SDK, пропущенный на машине TeamCity. Это вызвало ошибку из-за неправильного способа разрешения сборки.


1

Просто добавив этот ответ, чтобы помочь Google сэкономить немного времени, которое я потратил, чтобы добраться сюда. Я использовал ILMerge в своем проекте .Net 4.0 без установленного параметра / targetplatform, предполагая, что он будет правильно обнаружен в моей основной сборке. У меня тогда были жалобы от пользователей только на Windows XP или WinXP. Теперь это имеет смысл, поскольку в XP никогда не будет установлено> .Net 4.0, тогда как в большинстве новых ОС. Так что, если у ваших пользователей XP возникают проблемы, посмотрите исправления выше.


1

В моем случае у меня была проблема с использованием 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" />
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.