Typ 'System.Runtime.CompilerServices.ExtensionAttribute' konnte nicht aus Assembly 'mscorlib' geladen werden

145

Beim ersten Start meiner Website wird dieser Fehler angezeigt

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

Was mache ich falsch?

Ich verwende .NET 4 und starte die Site von Visual Studio aus.

Das einzige, was ich kürzlich geändert habe, ist das Hinzufügen von Simple Injector (über Nuget) zu meinem Projekt.

Hier ist die Stapelverfolgung

[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

Die erste Zeile aller Ansichten wird hervorgehoben, und wenn Sie den Mauszeiger darüber halten, wird dieser Fehler angezeigt

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'.
Sachin Kainth
quelle
1
Wir benötigen mehr Kontext darüber, wo und wie Sie Ihre Website starten. Verwenden Sie definitiv .NET 4 / 4.5?
Jon Skeet
1
Hinweis: Wenn bei der Ausgabe von Ihrem Build-Server dieselben Symptome auftreten, überprüfen Sie, ob Sie über die .net 4.0-Referenzbaugruppen verfügen. Nach der Installation von .net 4.5 müssen Sie diese von Ihrer Entwicklungsbox kopieren. Diese sind normalerweise wie folgt: C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework \ .NETFramework \ v4.0 Weitere Informationen finden Sie unter marcgravell.blogspot.co.nz/2012/09/…
Myster
1
Ich habe gerade ein ähnliches Problem mit einer .NET 4.5-DLL gesehen, die als Plugin für Microsoft Dynamics CRM 2011 auf einem Computer mit nur .NET 4.0 verwendet wird. Anstatt es einfach sofort abzulehnen, hat es es registriert und dann die Workflow-Anpassung vollständig abgebrochen (das Plugin enthielt eine benutzerdefinierte Workflow-Aktivität). Trace hat gezeigt, dass es ExtensionAttribute in mscorlib nicht finden konnte, hat mich hierher geführt, es für .NET 4.0 neu erstellt und das Problem gelöst! Dachte, das sollte für zukünftige Google-Fu erwähnt werden.
Matthew Walton

Antworten:

262

Der Typ 'System.Runtime.CompilerServices.ExtensionAttribute' konnte nicht aus der Assembly mscorlib geladen werden

Ja, dies kann technisch gesehen schief gehen, wenn Sie Code unter .NET 4.0 anstelle von .NET 4.5 ausführen. Das Attribut wurde in .NET 4.5 von System.Core.dll nach mscorlib.dll verschoben. Während das nach einer ziemlich bösen Änderung in einer Framework-Version klingt, die zu 100% kompatibel sein soll, soll ein [TypeForwardedTo] -Attribut diesen Unterschied unbeobachtbar machen.

Wie Murphy es gerne hätte, hat jede gut gemeinte Änderung wie diese mindestens einen Fehlermodus, an den niemand gedacht hat. Dies scheint schief zu gehen, wenn ILMerge verwendet wurde, um mehrere Assemblys zu einer zusammenzuführen, und dieses Tool falsch verwendet wurde. Ein guter Feedback-Artikel, der diesen Bruch beschreibt, ist hier . Es verweist auf einen Blog-Beitrag , der den Fehler beschreibt. Es ist ein ziemlich langer Artikel, aber wenn ich ihn richtig interpretiere, verursacht die falsche ILMerge-Befehlszeilenoption dieses Problem:

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

Welches ist falsch. Wenn Sie 4.5 auf dem Computer installieren, auf dem das Programm erstellt wird, werden die Assemblys in diesem Verzeichnis von 4.0 auf 4.5 aktualisiert und sind nicht mehr für Ziel 4.0 geeignet. Diese Baugruppen sollten eigentlich nicht mehr da sein, wurden aber aus kompatiblen Gründen aufbewahrt. Die richtigen Referenzbaugruppen sind die 4.0-Referenzbaugruppen, die an anderer Stelle gespeichert sind:

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

Mögliche Problemumgehungen bestehen darin, auf dem Buildcomputer auf 4.0 zurückzugreifen, .NET 4.5 auf dem Zielcomputer und den eigentlichen Fix zu installieren, das Projekt aus dem bereitgestellten Quellcode neu zu erstellen und den ILMerge-Befehl zu korrigieren.


Beachten Sie, dass dieser Fehlermodus nicht nur für ILMerge gilt, sondern nur ein sehr häufiger Fall ist. Jedes andere Szenario, in dem diese 4.5-Assemblys als Referenzassemblys in einem Projekt verwendet werden, das auf 4.0 abzielt, kann auf dieselbe Weise fehlschlagen. Nach anderen Fragen zu urteilen, besteht ein weiterer häufiger Fehlermodus in Build-Servern, die ohne Verwendung einer gültigen VS-Lizenz eingerichtet wurden. Und mit Blick darauf, dass die Multi-Targeting-Pakete kostenlos heruntergeladen werden können .

Die Verwendung der Referenzassemblys im Unterverzeichnis c: \ program files (x86) ist eine schwierige Anforderung. Ab .NET 4.0 ist dies bereits wichtig, um zu vermeiden, dass versehentlich eine Abhängigkeit von einer Klasse oder Methode besteht, die in den Versionen 4.01, 4.02 und 4.03 hinzugefügt wurde. Aber jetzt, wo 4.5 veröffentlicht wird, ist es absolut notwendig.

Hans Passant
quelle
31
Was für eine großartige Antwort.
Sachin Kainth
6
Ich bekomme alle die gleichen Symptome, aber ich benutze ILMerge nicht, irgendwelche Hinweise? Stacktrace hier Issues.umbraco.org/issue/U4-1708 , es könnte eine DLL eines Drittanbieters oder eines Drittanbieters sein, aber wie finde ich sie?
Myster
3
Hinweis: Bei 64-Bit-Windows-Versionen ist möglicherweise kein Ordner "C: \ Programme \ Referenzbaugruppen \ Microsoft \ Framework \ .NETFramework \ v4.0" vorhanden. Überprüfen Sie in diesem Fall, ob Sie ein "C: \ Programm" haben Ordner "Dateien (x86) \ Referenzassemblies \ Microsoft \ Framework \ .NETFramework \ v4.0".
Maarten Docter
3
Ich habe ILMerge nicht installiert und habe dieses Problem. Wie kann ich es beheben? Muss ich .net 4.5 auf dem Zielserver installieren?
TamarG
4
Es ist verwirrend für mich, warum alle darauf bestehen, dass dies etwas ist, das MS lösen sollte. Sie werden nicht, sie können Ihre kaputten Projekte nicht reparieren oder Server bauen. Verwenden Sie die richtigen Referenzbaugruppen, Problem gelöst.
Hans Passant
9

Ich hatte dieses Problem, außer dass der Typ, den es nicht laden konnte, System.Reflection.AssemblyMetadataAttribute war. Die Webanwendung wurde auf einem Computer mit installiertem .NET 4.5 (läuft dort einwandfrei) mit 4.0 als Zielframework erstellt. Der Fehler trat jedoch auf, wenn er auf einem Webserver ausgeführt wurde, auf dem nur 4.0 installiert war. Ich habe es dann auf einem Webserver mit 4.5 installiert und es gab keinen Fehler. Wie andere bereits gesagt haben, ist dies alles auf die verrückte Art und Weise zurückzuführen, wie Microsoft 4.5 veröffentlicht hat, bei der es sich im Grunde um ein Upgrade auf Version 4.0 handelt (und diese überschreibt). Die System.Reflection-Assembly verweist auf einen Typ, der in 4.0 (AssemblyMetadataAttribute) nicht vorhanden ist. Wenn Sie nicht über die neue System.Reflection.dll verfügen, schlägt dies fehl.

Sie können .NET 4.5 entweder auf dem Zielwebserver installieren oder die Anwendung auf einem Computer erstellen, auf dem 4.5 nicht installiert ist. Weit entfernt von einer idealen Auflösung.

EricP
quelle
8

Ich hatte genau das gleiche Problem mit einer Site (Kentico CMS), die mit der Entwicklung in 4.5 begann, herausfand, dass der Produktionsserver nur 4.0 unterstützt, und versuchte, zum Zielframework von 4.0 zurückzukehren. Kompilieren der anderen Beiträge in diesem Thread (insbesondere Ändern des Zielframeworks in .Net 4 und .Net 4.5, auf die noch verwiesen wird). Ich durchsuchte meine Lösung und stellte fest, dass eine Handvoll der NuGet-Pakete noch Bibliotheken mit targetFramework = "net45" verwendeten.

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>

Ich habe das Projektziel-Framework wieder auf 4.5 geändert, alle NuGet-Bibliotheken entfernt, auf 4.0 zurückgesetzt und die Bibliotheken erneut hinzugefügt (musste einige frühere Versionen verwenden, die nicht von 4.5 abhängig waren).

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>
vandsh
quelle
5

Ich bin heute gerade auf dieses nervige Problem gestoßen. Wir verwenden SmartAssembly, um unsere .NET-Assemblys zu packen / zu verschleiern, aber plötzlich funktionierte das Endprodukt auf unseren Testsystemen nicht mehr. Ich dachte nicht einmal, dass ich .NET 4.5 hätte, aber anscheinend hat es etwas vor ungefähr einem Monat installiert.

Ich habe 4.5 deinstalliert und 4.0 neu installiert, und jetzt funktioniert alles wieder. Nicht allzu beeindruckt davon, einen Nachmittag damit verbracht zu haben.

Professor 1942
quelle
Vorwarnung für Sie, AUCH WENN Sie das Problem anderweitig beheben, wird Ihre verschleierte Version erneut beschädigt, sodass Sie möglicherweise nie wissen, dass Sie es behoben haben. Das heißt, Sie können auf 4.5 aufbauen und problemlos auf Nur-4.0-Computern bereitstellen. Alles, was für mich notwendig war, war der Multi-Targeting-Patch, den Hans Passant erwähnt. Ich konnte anhand des Manifests in ILDASM erkennen, dass es korrekt auf System.Core anstatt auf mscorlib abzielte. Aber NICHT auf der Version, die über SmartAssembly (v5.5) ausgeführt wurde.
Josh Sutterfield
4

Beim Versuch, Daten aus einer Firebird-Datenbank zu lesen, ist das gleiche Problem aufgetreten. Nach vielen Stunden der Suche stellte ich fest, dass das Problem durch einen Fehler in der Abfrage verursacht wurde. Durch das Reparieren funktionierte es perfekt. Es hatte nichts mit der Version des Frameworks zu tun

user3036330
quelle
Mann, danke, ich bin auf das gleiche Problem gestoßen, wie hast du es behoben?
Benny
3

Wir sind auf dieses Problem gestoßen und haben es aufgespürt gestoßen Geocoding.net NuGet zurückgeführt Paket zurückgeführt, das wir zur Unterstützung unserer Google Maps-Ansichten verwendet haben (Geocoding.net Version 3.1.0, veröffentlicht am 04.02.2014).

Die Geocoding-DLL scheint .Net 4.0 zu sein, wenn Sie die Paketdatei untersuchen oder sie mit der Dot Peek-Anwendung von Jet Brains anzeigen. Ein Kollege von mir sagt jedoch, dass es mit ilmerge kompiliert wurde, sodass es höchstwahrscheinlich mit den oben aufgeführten ilmerge-Problemen zusammenhängt.

Es war ein langer Prozess, es aufzuspüren. Wir haben verschiedene Änderungssätze von TFS abgerufen, bis wir sie auf den Änderungssatz eingegrenzt haben, der das oben genannte NuGet-Paket hinzugefügt hat. Nach dem Entfernen konnten wir die Bereitstellung auf unserem .NET 4-Server durchführen.

David Yates
quelle
In unserem Fall wurde das Problem durch Quartz.NET v2.3 verursacht. Ein Upgrade auf Version 2.3.2 hat das Problem behoben.
Vertigo
2

In meinem Fall funktionierte das Projekt nach dem Downgrade von .NET 4.5 auf .NET 4.0 auf einem lokalen Computer einwandfrei, schlug jedoch nach der Veröffentlichung auf dem Server fehl.

Es stellte sich heraus, dass das Ziel einige alte Assemblys hatte, die immer noch auf .NET 4.5 verweisen.

Es wurde behoben, indem die Veröffentlichungsoption "Alle vorhandenen Dateien vor der Veröffentlichung löschen" aktiviert wurde.

Alexander Puchkov
quelle
1

In meinem Fall wurde das Blend SDK auf dem TeamCity-Computer verpasst. Dies verursachte den Fehler aufgrund einer falschen Art der Baugruppenlösung.

Yury Schkatula
quelle
1

Fügen Sie einfach diese Antwort hinzu, um Google dabei zu helfen, einige Stunden zu sparen, die ich aufgewendet habe, um hierher zu gelangen. Ich habe ILMerge in meinem .NET 4.0-Projekt ohne die Option / targetplatform verwendet, vorausgesetzt, es wird von meiner Hauptbaugruppe korrekt erkannt. Ich hatte dann Beschwerden von Benutzern nur unter Windows XP aka WinXP. Dies ist jetzt sinnvoll, da auf XP niemals> .Net 4.0 installiert sein wird, während dies bei den meisten neueren Betriebssystemen der Fall sein wird. Wenn Ihre XP-Benutzer Probleme haben, lesen Sie die obigen Korrekturen.

LMK
quelle
1

In meinem Fall hatte ich ein Problem mit der Verwendung von Microsoft.ReportViewer.WebForms. Ich habe validate = true aus der add verbZeile in web.config entfernt und es hat funktioniert:

<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" />
Matthew Lock
quelle