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

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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