Impossible de charger le système de type'.Runtime.CompilerServices.ExtensionAttribute " à partir de l'assembly 'mscorlib

Lors du démarrage de mon site web pour la première fois, je reçois cette erreur

Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

Qu'est-ce que je fais de mal?

J'utilise. net 4 et je démarre le site à partir de Visual Studio.

La seule chose que j'ai changé récemment est d'ajouter un injecteur Simple (via Nuget) dans mon projet.

Voici la trace de la pile

[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

La première ligne de toutes les vues est mise en surbrillance et lorsque vous les survolez, vous obtenez cette erreur

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'.
134
demandé sur BanksySan 2012-12-06 20:27:59

10 réponses

Impossible de charger le type ' Système.Runtime.CompilerServices.ExtensionAttribute ' à partir de l'assembly mscorlib

Oui, cela peut techniquement mal tourner lorsque vous exécutez du code sur. NET 4.0 au lieu de.Net 4.5. L'attribut a été déplacé à partir du Système.Core.dll à mscorlib.dll dans. Net 4.5. Bien que cela ressemble à un changement de rupture plutôt méchant dans une version de framework censée être compatible à 100%, un attribut [TypeForwardedTo] est censé faire cette différence non observables.

Comme Murphy l'aurait fait, chaque changement bien intentionné comme celui-ci a au moins un mode d'échec auquel personne n'a pensé. Cela semble mal tourner quand ILMerge a été utilisé pour fusionner plusieurs assemblys en un seul et que cet outil a été utilisé de manière incorrecte. Un bon article qui décrit cette rupture est ici. Il est lié à un blog post {[10] } qui décrit l'erreur. C'est plutôt un long article, mais si je l'interprète correctement alors la mauvaise ligne de commande ILMerge l'option provoque ce problème:

  /targetplatform:"v4,c:\windows\Microsoft.NET\Framework\v4.0.30319"

Ce qui est incorrect. Lorsque vous installez 4.5 sur la machine qui construit le programme, les assemblys de ce répertoire sont mis à jour de 4.0 à 4.5 et ne conviennent plus à target 4.0. Ces assemblées ne devraient vraiment plus être là, mais ont été conservées pour des raisons de compatibilité. Les assemblages de référence appropriés sont les assemblages de référence 4.0, stockés ailleurs:

  /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"

Donc, les solutions de contournement possibles sont de revenir à 4.0 sur la machine de construction, installez. net 4.5 sur la machine cible et le correctif réel, pour reconstruire le projet à partir du code source fourni, en corrigeant la commande ILMerge.


Notez que ce mode d'échec n'est pas exclusif à ILMerge, c'est juste un cas très courant. Tout autre scénario où ces assemblages 4.5 sont utilisés comme assemblages de référence dans un projet qui cible 4.0 est susceptible d'échouer de la même manière. A en juger par d'autres questions, un autre mode d'échec commun est dans les serveurs de construction qui ont été configurés sans utiliser une licence VS valide. Et en oubliant que les packs multi-ciblage sont un Téléchargement Gratuit .

En utilisant les assemblages de référence dans le c:\program le sous-répertoire files (x86) est une exigence difficile. À partir de. Net 4.0, il est déjà important d'éviter de prendre accidentellement une dépendance sur une classe ou une méthode ajoutée dans les versions 4.01, 4.02 et 4.03. Mais absolument essentiel maintenant que 4.5 est libéré.

249
répondu Hans Passant 2016-02-20 04:23:58

J'ai eu ce problème, sauf que le type qu'il ne pouvait pas charger était System.Réflexion.AssemblyMetadataAttribute. L'application web a été construite sur une machine avec.Net 4.5 installé (fonctionne bien là), avec 4.0 comme cadre cible, mais l'erreur s'est présentée lorsqu'elle a été exécutée sur un serveur web avec seulement 4.0 installé. Je l'ai ensuite essayé sur un serveur web avec 4.5 installé et il n'y avait pas d'erreur. Donc, comme d'autres l'ont dit, tout cela est dû à la manière tournoyante Microsoft a publié 4.5, qui est essentiellement un mise à niveau vers (et remplacement de) la version 4.0. système.Reflection assembly fait référence à un type qui n'existe pas dans 4.0 (AssemblyMetadataAttribute) donc il échouera si vous n'avez pas le nouveau système.Réflexion.DLL.

Vous pouvez soit installer. net 4.5 sur le serveur Web cible, soit créer l'application sur une machine sur laquelle 4.5 n'est pas installé. Loin d'un idéal de résolution.

8
répondu EricP 2013-11-26 20:56:57

J'ai eu exactement le même problème avec un site (Kentico CMS), en commençant le développement dans 4.5, en découvrant que le serveur de production ne supporte que 4.0, j'ai essayé de redescendre au framework cible de 4.0. Compiler les autres messages dans ce thread (en particulier en changeant le framework cible en. net 4 et. Net 4.5 toujours référencé). J'ai cherché dans ma solution et j'ai trouvé qu'une poignée de paquets NuGet utilisaient encore des bibliothèques avec 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>

J'ai changé le projets target framework retour à 4.5, supprimé toutes les bibliothèques NuGet, est redescendu à 4.0 et ré-ajouté les bibliothèques (a dû utiliser certaines versions précédentes qui ne dépendaient pas de 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>
7
répondu vandsh 2014-02-12 19:54:48

Je viens de rencontrer ce problème ennuyeux aujourd'hui. Nous utilisons SmartAssembly pour emballer / obscurcir nos assemblages. net, mais soudainement le produit final ne fonctionnait pas sur nos systèmes de test. Je ne pensais même pas avoir.net 4.5, mais apparemment quelque chose l'a installé il y a environ un mois.

J'ai désinstallé 4.5 et réinstallé 4.0, et maintenant tout fonctionne à nouveau. Pas trop impressionné d'avoir soufflé un après-midi sur ce.

4
répondu Professor1942 2014-02-14 01:43:30

J'ai rencontré le même problème en essayant de lire les données d'une base de données Firebird. Après de nombreuses heures de recherche, j'ai découvert que le problème était causé par une erreur que j'avais faite dans la requête. Le réparer l'a fait fonctionner parfaitement. Cela n'avait rien à voir avec la version du Framework

3
répondu user3036330 2013-11-26 12:18:27

Nous avons rencontré ce problème et l'avons suivi jusqu'au Geocoding.net NuGet paquet que nous utilisions pour aider avec nos vues Google Maps (Geocoding.net version 3.1.0 publié 2/4/2014).

La dll de géocodage semble être. Net 4.0 lorsque vous examinez le fichier de package ou le visualisez en utilisant L'application Dot Peek de Jet Brains; cependant, un de mes collègues dit qu'il a été compilé en utilisant ilmerge donc il est probablement lié aux problèmes ILMerge énumérés ci-dessus.

C'était un long processus pour le traquer. Nous avons récupéré différents changesets de TFS jusqu'à ce que nous l'ayons réduit au changeset qui a ajouté le paquet NuGet mentionné ci-dessus. Après l'avoir supprimé, nous avons pu déployer sur notre serveur.net 4.

2
répondu David Yates 2014-06-04 16:45:02

Dans mon cas, après le déclassement de. Net 4.5 à. NET 4.0, le projet fonctionnait bien sur une machine locale, mais échouait sur le serveur après la publication.

Il S'avère que la destination avait d'anciens assemblys, qui faisaient toujours référence à. Net 4.5.

Correction en activant l'option de publication "supprimer tous les fichiers existants avant de publier"

1
répondu Alexander Puchkov 2014-07-03 19:57:33

Dans mon cas, C'était Blend SDK manqué sur la machine TeamCity. Cela a provoqué l'erreur due à une résolution incorrecte de l'assemblage.

0
répondu Yury Schkatula 2015-10-19 12:55:26

Il suffit D'ajouter cette réponse pour aider Google à sauver quelques parieurs les heures que j'ai passées pour arriver ici. J'ai utilisé ILMerge sur mon projet. Net 4.0, sans le jeu d'options / targetplatform, en supposant qu'il serait détecté correctement à partir de mon assemblage principal. J'ai ensuite eu des plaintes d'utilisateurs uniquement sur Windows XP aka WinXP. Cela a maintenant du sens car XP n'aura jamais>. Net 4.0 installé alors que la plupart des systèmes d'exploitation plus récents le feront. Donc, si vos utilisateurs XP ont des problèmes, voir les correctifs ci-dessus.

0
répondu LMK 2016-08-17 02:04:11

Dans mon cas, j'ai eu un problème autour de L'utilisation de Microsoft.ReportViewer.WebForms. J'ai supprimé validate = true de la ligne add verb dans le web.config et il a commencé à fonctionner:

<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" />
0
répondu Matthew Lock 2018-02-20 08:21:05