Fehlermeldung über fehlende Assemblies nach Umstellen einer Webanwendung von .NET 4.6 nach .NET 4.7.2

Nachdem ich eine ASP.NET-Webanwendung (MVC und WebForms) von .NET 4.6.2 nach .NET 4.7.2 umgestellt hatte, hagelte es Fehlermeldungen dieser Form:

Die Datei oder Assembly „System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a“ oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.

Oder auch:

Die Datei oder Assembly „System.Runtime.InteropServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a“ oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.

Lösung

Ich bin dann wie folgt zur Lösung vorgegangen:

  1. Alle NuGet-Pakete via Package Manager Console Update-Package -Reinstall aktualisieren lassen.

  2. In der Datei „Web.config“ diese Zeile unter <configuration><system.web>
    <compilation><assemblies> ergänzt:

    <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
    
  3. In der Datei „Web.config“ alle Einträge unter <configuration><runtime><assemblyBinding> entfernt.

  4. Alle Dateien im „Bin“-Ordner der Webanwendung löschen.

  5. Einen Rebuild der Solution gemacht.

  6. Die unter „Error List“ als Warnungen ausgegebenen fehlenden Binding-Redirects per Doppelklick wieder ergänzen lassen.

Anschließend lief die Webanwendung wieder.

Das hat sowohl bei einer MVC-Anwendung, als auch bei einer WebForms-Anwendung funktioniert.

Wie aus dem Nichts habe ich jetzt bei einer, wie oben beschrieben, angepassten Anwendung folgende Meldung beim Aufruf erhalten:

[BadImageFormatException: Es kann keine Verweisassembly für die Ausführung geladen werden.]

[BadImageFormatException: Die Datei oder Assembly „System.Net.Http“ oder eine Abhängigkeit davon wurde nicht gefunden. Verweisassemblys sollten nicht für die Ausführung geladen werden. Sie können nur in einem Ladekontext nur für die Reflektion geladen werden. (Ausnahme von 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) +36
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) +21
System.Reflection.Assembly.Load(String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +38

[ConfigurationErrorsException: Die Datei oder Assembly „System.Net.Http“ oder eine Abhängigkeit davon wurde nicht gefunden. Verweisassemblys sollten nicht für die Ausführung geladen werden. Sie können nur in einem Ladekontext nur für die Reflektion geladen werden. (Ausnahme von HRESULT: 0x80131058)]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +726
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) +695

[HttpException (0x80004005): Die Datei oder Assembly „System.Net.Http“ oder eine Abhängigkeit davon wurde nicht gefunden. Verweisassemblys sollten nicht für die Ausführung geladen werden. Sie können nur in einem Ladekontext nur für die Reflektion geladen werden. (Ausnahme von HRESULT: 0x80131058)]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +659
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +89
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +188

Auf Englisch heißen die wichtigsten Meldungen:

Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context.

Ich bin erst mal noch ratlos, was da nun wieder die Ursache ist.

Diese Frage/Antwort empfiehlt, den „Bin“-Ordner im Web-Projekt zu löschen.

Update:

Das Löschen des „Bin“-Ordners hat doch geholfen, ich habe es in der ursprünglichen Liste oben ergänzt.

Manchmal muss man auch folgende Schritte bei einer bereits funktionierenden Anwendung mit .NET 4.7.2 machen:

  1. In der Datei „Web.config“ alle Einträge unterhalb von <configuration><runtime><assemblyBinding> entfernen.

  2. Alle Dateien im “Bin”-Ordner der Webanwendung löschen.

  3. Einen Rebuild der Solution machen.

  4. Die unter “Error List” als Warnungen ausgegebenen fehlenden Binding-Redirects per Doppelklick wieder ergänzen lassen.

Das war bei mir erforderlich, als ich einige NuGet-Pakete aktualisiert hatte.

Die Fehlermeldung kann auch lauten:

CS0012: The type ‚ValueType‘ is defined in an assembly that is not referenced. You must add a reference to assembly ‚netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51‘.

Die Fehlermeldung kann weiterhin auch lauten:

Die Datei oder Assembly „System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51“ oder eine Abhängigkeit davon wurde nicht gefunden. Die gefundene Manifestdefinition der Assembly stimmt nicht mit dem Assemblyverweis überein. (Ausnahme von HRESULT: 0x80131040)

Manchmal reicht auch schon dieses Vorgehen aus:

Also einfach alle Pakete neu installieren lassen.