wake-up-neo.com

.Net 4.6-Website lädt Referenzbaugruppen nicht korrekt

Ich habe ein Webprojekt in Visual Studio 2013, einschließlich mehrerer Bibliotheksprojekte.

Das Problem ist, dass das Hinzufügen einer Referenz (z. B. System.Collection, System.Net) zum Webprojekt als 'Referenzassembly' von C:\Program Files (x86)\Reference Assemblies\Microsoft hinzugefügt wird. Wenn sie in IIS geladen wird, lädt sie die Implementierung der Montage (von GAC). Beispielfehler folgt.

[BadImageFormatException: Cannot load a reference Assembly for execution.]

[BadImageFormatException: Could not load file or Assembly 'System.Collections' or one of its dependencies. Reference assemblies should not be loaded for execution.  They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)]
   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
   System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +34
   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +152
   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +77
   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +16
   System.Reflection.Assembly.Load(String assemblyString) +28
   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +38

[ConfigurationErrorsException: Could not load file or Assembly 'System.Collections' or one of its dependencies. Reference assemblies should not be loaded for execution.  They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)]
   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +728
   System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +196
   System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +45
   System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +172
   System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies() +91
   System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded) +111
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +156
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +624

[HttpException (0x80004005): Could not load file or Assembly 'System.Collections' or one of its dependencies. Reference assemblies should not be loaded for execution.  They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +659
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +95
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +189

Durch das Löschen der Referenz-DLLs aus dem Ordner "bin" wird das Problem behoben. Ich bin jedoch nicht sicher, was geändert werden muss, um das Problem ordnungsgemäß zu beheben.

16
Sam

Auflösung:

Meine Bibliotheksprojekte referierten auf einige Kernbibliotheken (System.* etc), wobei die Option RequiredTargetFramework auf 3.5 gesetzt war. Dies war nur in der csproj-Datei ersichtlich, Beispiel:

<Reference Include="System.Core">
  <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>

Visual Studio versuchte, alle möglichen Probleme mit .net-Versionen zu verursachen, indem er verbindliche Weiterleitungen in meine web.config hinzufügte, um diese erfolglos auf v4 (und Referenz-Assemblys) zu verweisen.

Das Entfernen aller RequiredTargetFramework-Elemente aus den csproj-Dateien hat das Problem gelöst.

4
Sam

Ich lösche das Paket aus dem Ordner/Bin  

System.Collections und System.Collections.Concurrent

und Wiederaufbauprojekt 

es funktioniert.

29
Brayan Aguilar

Jedes Mal, wenn Sie BadImageFormatException sehen, besteht ein Problem mit der Kompatibilität des Binärformats. Möglicherweise ist Ihr IIS - Pool so konfiguriert, dass er einen 32-Bit-Pool ausführt, und Ihre Assemblys sind in x64 oder umgekehrt aufgebaut. Oder Sie versuchen, x64-Assemblys auf einem 32-Bit-Computer auszuführen. Möglicherweise verfügen Sie über x64-Computer und alle von einem Computer erstellten Assemblys, aber einige Assemblys von Drittanbietern werden ausschließlich aus 32-Bit-Code erstellt.

Es ist eines davon oder ähnliches

Nun hat "usr" hier einen guten Punkt. Sie haben Cannot load a reference Assembly for execution aber im Kontext mit BadImageFormatException. Ich frage mich, ob dies zur Kompilierungszeit geschieht. Versuchen Sie, dies zu web.config hinzuzufügen

<compilation>
  <assemblies>
      <remove Assembly="System.Collections" />
  . . . . 

Oder wenn Sie haben 

<add Assembly="System.Collections. . . ."  />

Entfernen Sie es zuerst

Normalerweise ist GAC der bevorzugte Ort für die Referenz, es sei denn, Sie geben probing ein.

4
T.S.

Es ist mir nach dem Update VS 15.8 passiert. Wenn Sie "Lokal kopieren" auf "falsch" setzen, wurde das Problem für jede Assembly behoben, die den Fehler ergab. Außerdem entfernte ich (von Hand) doppelte "<Private>" -Tags in .csproj.

0
Felipe Moura

In meinem Fall habe ich das Nuget-Paket System.Collections zu meinem Projekt asp.net 4.6.1 hinzugefügt. Aus irgendeinem Grund wurde in der Datei csproj nicht darauf verwiesen. Ich habe die Csproj-Datei manuell bearbeitet und den Verweis hinzugefügt. Lade es neu und, voila, hat gearbeitet!

0
Marco Alves

Dieses Problem tritt häufig auf, wenn Ihre verbindlichen Weiterleitungen auf frühere Versionen verweisen als von Ihren Referenzen abhängig, und dies kann nach dem Aktualisieren von Paketen (z. B. über NuGet) der Fall sein. Um das Problem allgemein zu lösen, habe ich eine Reihe von Schritten als Antwort hier hinzugefügt. Für dieses spezielle Problem empfehle ich jedoch ausdrücklich den folgenden Schritt 5:

Entfernen Sie alle Assembly-Bindungen aus allen app.config - und Web.config -Dateien und erstellen Sie dann Ihre Lösung. app.config Bindungen sind nicht mehr erforderlich. Web.config -Bindungen werden im nächsten Schritt erneut hinzugefügt. Wenn Sie sie jedoch zuerst entfernen, wird sichergestellt, dass in den Bindungen keine veralteten Versionen vorhanden sind.

0
Neo