web-dev-qa-db-fra.com

'Impossible de charger le fichier ou l'assembly' netstandard, Version = 2.0.0.0, ... '. Les assemblys de référence ne doivent pas être chargés pour exécution

Objectif: À partir d'une application console .NET 4.7, en utilisant la réflexion avec Assembly.GetType (), j'essaie d'extraire le type d'une classe netstandard 2.0 de Assembly X. Ensuite, je souhaite créer une instance de celui-ci. Tapez avec Activator.CreateInstance (). 

Ce que j'essaie de faire: Cependant, cette Assemblée X a une dépendance à la norme 2.0. Pour pouvoir obtenir le type, la dépendance Netstandard doit être chargée dans le domaine AppDomain. C'est pourquoi, lorsque AppDomain demande l'assembly netstandard via l'événement AssemblyResolve, je charge simplement la dll comme ceci:

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);

Ce qui jette:

System.BadImageFormatException: 'Impossible de charger le fichier ou l'assembly 'fichier: /// C:\Utilisateurs\vincent.lerouvillois.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\netstandard.dll' ou une de ses dépendances. Les assemblages de référence ne doivent pas être chargés pour l'exécution. Ils ne peuvent être chargés que dans le chargeur Reflection only le contexte. (Exception de HRESULT: 0x80131058) '

Exception interne: BadImageFormatException: impossible de charger une référence Assemblée pour exécution.

Ce que je sais: Je sais qu'ils veulent que nous chargions la DLL avec Assembly.ReflectionOnlyLoadFrom. Mais cela m'empêchera d'instancier le type avec Activator.CreateInstance (). Voir Article officiel Microsoft

De plus, j'ai essayé de référencer les packages Nuget NETStandard.Library 2.0.0-preview1-25301-01 et NETStandard.Library.NETFramework 2.0.0-preview1-25305-02 dans mon application de console afin de référencer les bibliothèques netstandard 2.0, ça n'a rien changé.

Question: Est-ce que quelqu'un sait s'il existe un moyen approprié de charger cette dll sans erreur, ou peut-être s'il s'agit d'un bogue, ou autre? Ou pourquoi ce type de dll n'est pas capable de charger pour exécution?

11

Le fichier netstandard.dll que vous essayez de charger est un assemblage de référence qui ne peut pas être chargé pour l'exécution sur le .NET Framework comme indiqué par d'autres. Toutefois, si vous devez résoudre cette dépendance, vous devez disposer d'une version d'exécution mappée sur la structure sur laquelle vous essayez de s'exécuter.

Pour la prise en charge .NET Standard, nous les incluons dans les extensions msbuild fournies avec VS, vous voulez donc obtenir la version de netstandard.dll à partir de là. Selon la version de VS2017 que vous avez installée, elle devrait se situer quelque part comme C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll ou depuis le SDK .NET Core 2.0, vous pouvez la trouver C:\Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll

Essayez d’utiliser l’une de ces versions dans votre scénario. 

8
Wes Haggard

Vous ne pouvez pas charger une assemblée de référence.

.NET Standard est un ensemble d’API qui doivent être fournis par des implémentations compatibles .NET Standard.

Une assemblée de référence contient uniquement des contrats. Cela signifie qu'il ne contient aucune implémentation. L'assembly que vous essayez de charger contient les contrats .NET Standard 2.0.

Un contrat ressemble à ceci: https://github.com/dotnet/standard/blob/master/netstandard/ref/mscorlib.cs

EDIT: .NET Framework 4.7 implémente .NET Standard 2.0, vous ne devriez donc pas avoir à charger d'assembly pour utiliser Activator.CreateInstance() pour instancier un type .NET Standard.

3
José Pedro

NETStandard 2.0.0-preview1 n’est pas compatible avec net461 et net47.

mais pour reales. NET Core SDK 2.0 assemblies (ainsi que 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);

tout est OK.

Mais si vous devez charger des bibliothèques preview1, vous devriez peut-être utiliser netstandard2.0 à la place de net471.

2
pavel.smolkin

Définissez Copy Enbale sur true dans les propriétés netstandard.dll.

  1. Ouvrez l'Explorateur de solutions et cliquez avec le bouton droit sur netstandard.dll.
  2. Définissez Copy Enbale sur true.

 enter image description here

2
Armaan

Installez NetStandard.Library 2.0.0.0 de NuGet, cela fonctionne pour moi. quand je rétrograde .net framework 4.6.1 à 4.6.0

0
R Riteshk