wake-up-neo.com

"Datei oder Assembly konnte nicht geladen werden", netstandard, Version = 2.0.0.0, ... ". Referenzbaugruppen sollten nicht zur Ausführung geladen werden

Goal: Ich versuche aus einer .NET 4.7-Konsolen-App mit Reflektion mit Assembly.GetType () den Typ einer netstandard 2.0-Klasse aus Assembly X zu extrahieren. Dann möchte ich eine Instanz davon erstellen Geben Sie mit Activator.CreateInstance () ein. 

Was ich versuche zu tun: Diese Assembly X hat jedoch eine Abhängigkeit vom Netzstandard 2.0. Um den Typ abrufen zu können, muss die netstandard-Abhängigkeit in die AppDomain geladen werden. Wenn die AppDomain die netstandard Assembly über das AssemblyResolve-Ereignis anfordert, lade ich die DLL daher einfach so:

var netStandardDllPath = @"C:\Users\xxx\.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\netstandard.dll";

return Assembly.LoadFrom(netStandardDllPath);

Welche wirft:

System.BadImageFormatException: 'Datei oder Assembly konnte nicht geladen werden 'file: /// C:\Users\vincent.lerouvillois.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\netstandard.dll' oder eine seiner Abhängigkeiten. Referenzbaugruppen sollten nicht geladen werden zur Ausführung. Sie können nur in den Reflection-Only-Loader geladen werden Kontext. (Ausnahme von HRESULT: 0x80131058) '

Innere Ausnahme: BadImageFormatException: Ein Verweis kann nicht geladen werden Montage zur Ausführung.

Was ich weiß: Ich weiß, dass sie die DLL mit Assembly.ReflectionOnlyLoadFrom laden sollen. Dadurch kann ich den Typ jedoch nicht mit Activator.CreateInstance () instanziieren. Siehe Microsoft offiziellen Beitrag

Ich habe auch versucht, die Nuget-Pakete NETStandard.Library 2.0.0-preview1-25301-01 und NETStandard.Library.NETFramework 2.0.0-preview1-25305-02 in meiner Konsolen-App zu referenzieren, so dass die netstandard 2.0-Bibliotheken referenziert werden es hat sich nichts geändert.

Question: Weiß jemand, ob es eine korrekte Möglichkeit gibt, die DLL fehlerfrei zu laden, oder ob dies ein Fehler ist oder nicht? Oder warum kann diese Art von DLL nicht zur Ausführung geladen werden?

11

Die netstandard.dll, die Sie laden möchten, ist eine Referenz-Assembly, die nicht zur Laufzeit unter .NET Framework geladen werden kann, wie von anderen angegeben. Wenn Sie diese Abhängigkeit jedoch auflösen müssen, müssen Sie eine Laufzeitversion erstellen, die dem Framework entspricht, auf dem Sie versuchen, ausgeführt zu werden.

Für die .NET-Standard-Unterstützung bieten wir sie als Teil der mit VS gelieferten msbuild-Erweiterungen an, sodass Sie die Version von netstandard.dll von dort herunterladen möchten. Abhängig davon, welche Version von VS2017 Sie installiert haben, sollte es sich an einem Ort wie C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll befinden, oder vom .NET Core 2.0 SDK aus können Sie es C:\Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll finden.

Versuchen Sie es mit einer dieser Versionen in Ihrem Szenario. 

8
Wes Haggard

Sie können keine Referenzbaugruppe laden.

.NET Standard ist eine Sammlung von APIs, die must von mit .NET Standard kompatiblen Implementierungen bereitgestellt werden müssen.

Eine Referenzversammlung enthält nur Verträge. Das heißt, es enthält keine Implementierung. Die Assembly, die Sie laden möchten, enthält die .NET Standard 2.0-Verträge.

Ein Vertrag sieht folgendermaßen aus: https://github.com/dotnet/standard/blob/master/netstandard/ref/mscorlib.cs

EDIT: .NET Framework 4.7 implementiert .NET Standard 2.0. Sie müssen daher keine Assembly laden, um Activator.CreateInstance() zu verwenden, um einen .NET Standard-Typ zu instanziieren.

3
José Pedro

NETStandard 2.0.0-preview1 ist nicht mit net461 und net47 kompatibel.

aber für echte .NET Core SDK 2.0-Assemblys (sowie 2.0.0-preview2)

 var netStandardDllPath = @"c:\Program Files\dotnet\sdk\NuGetFallbackFolder\Microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\netstandard.dll";
 Console.WriteLine(Assembly.LoadFrom(netStandardDllPath).FullName);

alles ist ok.

Wenn Sie jedoch unbedingt Preview1-Bibliotheken laden müssen, sollten Sie netstandard2.0 statt net471 verwenden.

2
pavel.smolkin

Setzen Sie Copy Enbale in den Eigenschaften von netstandard.dll auf true.

  1. Öffnen Sie den Projektmappen-Explorer und klicken Sie mit der rechten Maustaste auf netstandard.dll.
  2. Setzen Sie Copy Enbale auf true.

 enter image description here

2
Armaan

Beeindruckend. Ich habe gerade mehrere Stunden damit verbracht, die Ursache dieses Fehlers "konnte nicht geladen werden ... netstandard" aufzuspüren.

Für mich bestand das Problem darin, dass mein .NET Framework-Projekt (das sowohl auf .NET Framework- als auch auf .NET Standard-Bibliotheken verweist) mit .NET Framework 4.7.2 erstellt wurde und auf dem System, auf dem ich es bereitgestellt und ausgeführt habe, nicht 4.7.2 vorhanden war Eingerichtet.

Das Bereitstellen eines sehr kleinen Konsolenprojekts mit der gleichen Grundstruktur und den gleichen Verweisen und das Ausführen des Projekts in einem Befehlsfenster ergab schließlich in einem Popup den korrekten Fehler, dass .NET Framework 4.7.2 fehlte.

Wenn Sie mit diesem bestimmten Fehler zu kämpfen haben, stellen Sie sicher, dass Sie das erforderliche .NET Framework installiert haben.

1
MikeZ

Für mich gelöst Folgendes zu tun: 1 - Installierte neueste .Net Framework auf dem Server. 2 - Windows Server und mein lokaler Computer aktualisiert. 3 - Wurde zum Verwalten des Nuget-Pakets und aktualisiert alle Verweise auf der Registerkarte "Aktualisieren".

Vielleicht kann nur Schritt 3 in Ihrem Fall gelöst werden

0
VINICIUS SIN

Installieren Sie NetStandard.Library 2.0.0.0 von NuGet. Es funktioniert für mich. beim Downgrade von .NET Framework 4.6.1 auf 4.6.0

0
R Riteshk