149 votes

Impossible de charger le type "System.Runtime.CompilerServices.ExtensionAttribute" de l'assemblage "mscorlib".

Lorsque je démarre mon site web pour la première fois, j'obtiens 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 lance le site à partir de Visual Studio.

La seule chose que j'ai changée récemment est d'ajouter Simple Injector (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'.

1 votes

Nous avons besoin de plus de contexte sur l'endroit où vous commencez votre site web, et comment. Utilisez-vous définitivement .NET 4/4.5 ?

1 votes

NB : si quelqu'un a les mêmes symptômes sur la sortie de votre serveur de construction, vérifiez que vous avez les assemblages de référence .net 4.0, après avoir installé .net 4.5, vous devrez les copier depuis votre boîte de développement. Ils sont typiquement quelque part comme : C:\Program Fichiers (x86) \Reference Assemblages \Microsoft\Framework\.NETFramework\v4.0 Pour plus de détails, voir marcgravell.blogspot.co.nz/2012/09/

1 votes

Je viens de rencontrer un problème similaire avec une DLL .NET 4.5 utilisée comme plugin pour Microsoft Dynamics CRM 2011 sur une machine qui n'avait que .NET 4.0. Au lieu de le rejeter purement et simplement, il l'a enregistré et a ensuite complètement interrompu la personnalisation du flux de travail (le plugin contenait une activité de flux de travail personnalisée). Le traçage a montré qu'il ne pouvait pas trouver ExtensionAttribute dans mscorlib, ce qui m'a conduit ici, je l'ai reconstruit pour .NET 4.0 et le problème a été résolu ! J'ai pensé que cela devait être mentionné pour une future recherche sur Google.

265voto

Hans Passant Points 475940

Impossible de charger le type 'System.Runtime.CompilerServices.ExtensionAttribute' de l'assemblage mscorlib.

Oui, cela peut techniquement mal se passer lorsque vous exécutez du code sur .NET 4.0 au lieu de .NET 4.5. L'attribut a été déplacé de System.Core.dll à mscorlib.dll dans .NET 4.5. Bien que cela semble être un changement de rupture plutôt désagréable dans une version du framework qui est censée être 100% compatible, un attribut [TypeForwardedTo] est censé rendre cette différence inobservable.

Comme le veut Murphy, chaque changement bien intentionné comme celui-ci a au moins un mode de défaillance auquel personne n'a pensé. Il semble que cela ait mal tourné lorsque ILMerge a été utilisé pour fusionner plusieurs assemblages en un seul et que cet outil a été utilisé de manière incorrecte. Un bon article de retour d'expérience qui décrit cette rupture est ici . Il est lié à un article de blog qui décrit l'erreur. C'est un article assez long, mais si je l'interprète correctement, c'est la mauvaise option de ligne de commande d'ILMerge qui cause ce problème :

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

Ce qui est incorrect. Lorsque vous installez la version 4.5 sur la machine qui construit le programme, les assemblages de ce répertoire sont mis à jour de la 4.0 à la 4.5 et ne sont plus adaptés à la cible 4.0. Ces assemblages ne devraient plus être là, mais ont été conservés 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"

Les solutions possibles sont donc de revenir à la version 4.0 sur la machine de construction, d'installer .NET 4.5 sur la machine cible et de 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 commun. Tout autre scénario dans lequel ces assemblages 4.5 sont utilisés comme assemblages de référence dans un projet ciblant 4.0 est susceptible d'échouer de la même manière. D'après d'autres questions, un autre mode d'échec courant concerne les serveurs de construction qui ont été configurés sans utiliser une licence VS valide. Et si l'on oublie que les packs de multi-ciblage sont un élément essentiel de la stratégie de développement de VS. 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 incontournable. À partir de .NET 4.0, il était déjà important d'éviter de prendre accidentellement une dépendance sur une classe ou une méthode qui a été ajoutée dans les versions 4.01, 4.02 et 4.03. Mais il est absolument essentiel maintenant que la version 4.5 est sortie.

6 votes

J'obtiens tous les mêmes symptômes, mais je n'utilise pas ILMerge, des indices ? stacktrace ici issues.umbraco.org/issue/U4-1708 Il pourrait s'agir d'une DLL d'une tierce ou d'une quatrième partie, mais comment la trouver ?

3 votes

Note : Vous ne pouvez pas avoir un " C:\Program Fichiers \Reference Assemblages \Microsoft\Framework\.NETFramework\v4.0 "dans le cas des versions 64 bits de Windows, dans ce cas, vérifiez si vous avez un dossier " C:\Program Fichiers (x86) \Reference Assemblages \Microsoft\Framework\.NETFramework\v4.0 dossier ".

3 votes

Je n'ai pas installé ILMerge et j'ai ce problème, alors comment puis-je le résoudre ? Dois-je installer .net 4.5 sur le serveur cible ?

11voto

EricP Points 59

J'ai eu ce problème, sauf que le type qu'il ne pouvait pas charger était System.Reflection.AssemblyMetadataAttribute. L'application web a été construite sur une machine sur laquelle .NET 4.5 est installé (elle fonctionne bien), avec 4.0 comme framework 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é. J'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 ceci est dû à la manière tordue dont Microsoft a publié la version 4.5, qui est en fait une mise à niveau de la version 4.0 (et un remplacement de celle-ci). L'assemblage System.Reflection fait référence à un type qui n'existe pas dans la version 4.0 (AssemblyMetadataAttribute). Il échouera donc si vous ne disposez pas de la nouvelle dll System.Reflection.dll.

Vous pouvez soit installer .NET 4.5 sur le serveur web cible, soit construire l'application sur une machine sur laquelle la version 4.5 n'est pas installée. C'est loin d'être une résolution idéale.

8voto

vandsh Points 31

J'ai eu exactement le même problème avec un site (Kentico CMS), en commençant le développement en 4.5, en découvrant que le serveur de production ne supporte que la 4.0, j'ai essayé de revenir au framework cible de 4.0. J'ai consulté les autres messages de ce fil de discussion (en particulier le changement du cadre cible en .Net 4 et le fait que .Net 4.5 soit toujours référencé). J'ai cherché dans ma solution et j'ai constaté 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 modifié le framework cible des projets pour revenir à la version 4.5, supprimé toutes les bibliothèques NuGet, redescendu à la version 4.0 et ajouté à nouveau les bibliothèques (j'ai dû utiliser certaines versions antérieures qui ne dépendaient pas de la version 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>

6voto

Professor1942 Points 21

Je viens de rencontrer ce problème ennuyeux aujourd'hui. Nous utilisons SmartAssembly pour emballer/obfusquer nos assemblages .NET, mais soudain, le produit final ne fonctionnait plus 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é la 4.5 et réinstallé la 4.0, et maintenant tout fonctionne à nouveau. Je ne suis pas très impressionné par le fait d'avoir gaspillé un après-midi sur ce problème.

0 votes

Un avertissement préalable pour vous, MÊME SI vous résolvez le problème autrement, votre version obfusquée sera à nouveau cassée, et vous ne saurez peut-être jamais que vous l'avez résolu. C'est-à-dire que vous POUVEZ construire en 4.5 et déployer sans problème sur des machines uniquement en 4.0. Tout ce qui était nécessaire pour moi était le patch multi-cibles mentionné par Hans Passant. Je pouvais voir en regardant le manifeste dans ILDASM qu'il ciblait correctement System.Core au lieu de mscorlib. Mais PAS sur la version qui avait été exécutée par SmartAssembly (v5.5).

4voto

user3036330 Points 21

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 dû à une erreur que j'avais commise dans la requête. En la corrigeant, le système a fonctionné parfaitement. Cela n'avait rien à voir avec la version du Framework.

0 votes

Merci, j'ai rencontré le même problème, comment l'avez-vous résolu ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X