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



единственное, что я недавно изменил, это добавить простой инжектор (через 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'.
887   10  

10 ответов:

не удалось загрузить тип System.Во время выполнения.CompilerServices.ExtensionAttribute ' из сборки mscorlib

Да, это технически может пойти не так, когда вы выполняете код на .NET 4.0 вместо .NET 4.5. Атрибут был перемещен из системы.Ядро.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. Эти сборки действительно не должны были быть там больше, но были сохранены по причинам compat. Соответствующие ссылочные сборки-это ссылочные сборки 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 выпущен.

У меня была эта проблема, за исключением типа, который он не мог загрузить, была система.Отображение.AssemblyMetadataAttribute. Веб-приложение было построено на машине с установленным .NET 4.5 (работает нормально), с 4.0 в качестве целевой платформы, но ошибка возникла, когда она была запущена на веб-сервере с установленным только 4.0. Затем я попробовал его на веб-сервере с 4.5 установки и отсутствия ошибок. Итак, как говорили другие, это все из-за того, что Microsoft выпустила 4.5, который в основном является обновление до (и перезапись) версии 4.0. система.Сборка отражения ссылается на тип, который не существует в 4.0 (AssemblyMetadataAttribute), поэтому он не будет работать, если у вас нет новой системы.Отображение.файл 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>

I изменил целевую структуру проектов обратно на 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. После многих часов поиска я обнаружил, что проблема была вызвана ошибкой, которую я сделал в запросе. Ремонт это прекрасно работает. Это не имело ничего общего с версией фреймворка

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

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

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

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

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

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

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

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

в моем случае у меня была проблема с использованием Microsoft.Элемент управления reportviewer.Веб-формы. Я удалил validate=true из add verb строку в web.конфиг и он начал работать:

<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" />

Comments

    Ничего не найдено.