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

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

Что я пытаюсь сделать: Тем не менее, эта сборка X имеет зависимость от Netstandard 2.0. Чтобы получить тип, необходимо загрузить нестандартную зависимость в домен приложений. Поэтому, когда AppDomain запрашивает нестандартную сборку через событие 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 не может загрузить для выполнения?

Ответ 1

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

Для поддержки .NET Standard мы включаем их как часть расширений 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

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

Ответ 2

Установите для параметра Copy Enbale значение true в свойствах netstandard.dll.

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

enter image description here

Ответ 3

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

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

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

Контракт выглядит следующим образом: https://github.com/dotnet/standard/blob/master/netstandard/ref/mscorlib.cs

РЕДАКТИРОВАТЬ:.NET Framework 4.7 реализует .NET Standard 2.0, поэтому вам не нужно загружать какую-либо сборку для использования Activator.CreateInstance() для создания стандартного типа .NET.

Ответ 4

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

но для реальных сборок .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.

Ответ 5

Установите NetStandard.Library 2.0.0.0 от NuGet, у меня работает. когда я понижаю версию .net Framework 4.6.1 до 4.6.0

Ответ 6

Для меня решено сделать следующее: 1 - Установить последнюю версию .Net Framework на сервер. 2 - Обновлен сервер Windows и мой локальный компьютер. 3 - Пошел, чтобы Управлять Пакетом Nuget и обновил все ссылки на вкладке обновления.

Возможно, только выполнение шага 3 может решить в вашем случае

Ответ 7

Вот это да. Я просто потратил несколько часов, отслеживая причину этой ошибки "не удалось загрузить... стандартный".

Для меня проблема заключалась в том, что мой проект .NET Framework (который ссылается как на библиотеки .NET Framework, так и на библиотеки .NET Standard) был построен с использованием .NET Framework 4.7.2, а система, в которой он был развернут и запущен, не имела 4.7.2. установлены.

Развертывание очень маленького консольного проекта с той же базовой структурой и ссылками и выполнение этого в окне командной строки, наконец, выявило правильную ошибку во всплывающем окне, в котором отсутствовал .NET Framework 4.7.2.

Если вы боретесь с этой конкретной ошибкой, убедитесь, что у вас установлен необходимый .NET Framework.