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'.
Antworten:
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:
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:
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.
quelle
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.
quelle
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.
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).
quelle
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.
quelle
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
quelle
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.
quelle
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.
quelle
In meinem Fall wurde das Blend SDK auf dem TeamCity-Computer verpasst. Dies verursachte den Fehler aufgrund einer falschen Art der Baugruppenlösung.
quelle
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.
quelle
In meinem Fall hatte ich ein Problem mit der Verwendung von Microsoft.ReportViewer.WebForms. Ich habe validate = true aus der
add verb
Zeile in web.config entfernt und es hat funktioniert:quelle