«Не удалось загрузить файл или сборку netstandard, Version = 2.0.0.0, …». Ссылочные сборки не должны загружаться для выполнения

objective: из консольного приложения .NET 4.7, используя reflection с Assembly.GetType (), я пытаюсь извлечь тип classа netstandard 2.0 из Assembly X. Затем я хочу создать экземпляр этого типа с Activator.CreateInstance () ,

То, что я пытаюсь сделать: Однако эта assembly X имеет зависимость от netstandard 2.0. Чтобы иметь возможность получить тип, зависимость netstandard должна быть загружена в AppDomain. Вот почему, когда AppDomain запрашивает сборку netstandard через событие AssemblyResolve, я просто загружаю dll следующим образом:

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

Что бросает:

System.BadImageFormatException: «Не удалось загрузить файл или сборку»: /// C: \ Users \ vincent.lerouvillois.nuget \ packages \ NETStandard.Library.2.0.0-preview1-25301-01 \ build \ netstandard2.0 \ ref \ netstandard.dll ‘или одной из его зависимостей. Ссылочные сборки не должны загружаться для выполнения. Их можно загружать только в контекст загрузчика только для отражения. (Исключение из HRESULT: 0x80131058) ‘

Внутреннее исключение: BadImageFormatException: невозможно загрузить контрольную сборку для выполнения.

Я знаю: я знаю, что они хотят, чтобы мы загружали DLL с помощью Assembly.ReflectionOnlyLoadFrom. Но выполнение этого не позволит мне установить тип с помощью Activator.CreateInstance (). См. Официальный пост Microsoft

Кроме того, я попытался ссылаться на пакеты Nuget NETStandard.Library 2.0.0-preview1-25301-01 и NETStandard.Library.NETFramework 2.0.0-preview1-25305-02 в моем консольном приложении, чтобы он ссылался на библиотеки netstandard 2.0, но это ничего не изменило.

Вопрос: Кто-нибудь знает, есть ли способ загрузить эту DLL без ошибок, или, может быть, если это ошибка, иначе? Или почему этот тип dll не может загрузить для выполнения?

Вы не можете загрузить контрольную сборку.

.NET Standard – это набор API-интерфейсов, которые должны предоставляться стандартными совместимыми реализациями .NET.

Ссылка содержит только контракты. Это означает, что он не содержит реализации. Сборка, которую вы пытаетесь загрузить, содержит контракты .NET Standard 2.0.

Контракт выглядит так: https://github.com/dotnet/standard/blob/master/netstandard/ref/mscorlib.cs

EDIT: .NET Framework 4.7 реализует .NET Standard 2.0, поэтому вам не нужно загружать какую-либо сборку для использования Activator.CreateInstance() для создания экземпляра стандартного типа .NET.

Загружаемый файл netstandard.dll – это эталонная assembly, которая не может быть загружена для среды выполнения на .NET Framework, как указано другими. Однако, если вам нужно решить эту зависимость, вам понадобится версия времени выполнения, которая будет сопоставляться с фреймворком, который вы пытаетесь запустить.

Для поддержки стандарта .NET мы включаем их как часть расширений msbuild, которые поставляются с VS, поэтому вы захотите получить версию netstandard.dll оттуда. В зависимости от версии VS2017, которую вы установили, она должна быть где-то вроде C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll или из SDK .NET Core 2.0 вы можете найти его C:\Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll

Попробуйте использовать одну из этих версий в своем сценарии.

NETStandard 2.0.0-preview1 в несовместимости с net461 и net47.

но для реальных compilationов .NET Core SDK 2.0 (а также 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); 

все нормально.

Но если вам нужно загружать библиотеки preview1, возможно, вам стоит использовать netstandard2.0 вместо net471.

Copy Enbale в true в свойствах netstandard.dll.

  1. Откройте обозреватель решений и щелкните правой кнопкой мыши по netstandard.dll.
  2. Установите Copy Enbale в true.

введите описание изображения здесь