Не вдалося завантажити тип "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
Примітка: якщо хтось має такі ж симптоми на виході з вашого сервера збирання, перевірте, чи є у вас .net 4.0 довідкові збірки, після встановлення .net 4.5 вам потрібно буде скопіювати їх із свого вікна розробки. Вони зазвичай десь такі, як: C: \ Program Files (x86) \ Reference Assembly \ Microsoft \ Framework \ .NETFramework \ v4.0 Детальніше див. Marcgravell.blogspot.co.nz/2012/09/…
— Myster

1
Я щойно бачив подібну проблему, коли .NET 4.5 DLL використовується як плагін для 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 тут issues.umbraco.org/issue/U4-1708 , це може бути DLL третьої чи четвертої партії, але як це знайти?
— Містер

3
Примітка. У вас не може бути папки "C: \ Program Files \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0" у випадку 64-розрядної версії Windows, у цьому випадку перевірте, чи є у вас програма "C: \ Файли (x86) \ Довідкові збори \ Microsoft \ Framework \ .NETFramework \ v4.0 ".
— Maarten Docter

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, опублікована 4.04.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 aka 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.