Использование.net standard 1.5 lib в.net 4.6.2 пропускает System.Runtime 4.1.0.0
У меня есть некоторые проблемы при использовании.net стандарта в.net Framework 4.6.2 consoleapps.
Я мог бы свести проблему к этому: Дано:
Я создаю клиентскую библиотеку стандарта.net 1.5 по сравнению с 2017 годом с этим единственным классом
public class Class1
{
public List<int> Get()
{
return new List<int>() { 1, 2, 3, 4, 5, 65, 6 };
}
}
Теперь я создаю новое консольное приложение.net 4.6.2, которое просто вызывает метод этого класса:
static void Main(string[] args)
{
var foo = new Class1();
Console.WriteLine("Done!");
Console.ReadLine();
}
Теперь я получаю
System.IO.FileNotFoundException: "Файл или сборка"System.Runtime, версия =4.1.0.0, культура = нейтральная, PublicKeyToken=b03f5f7f11d50a3a не найдена
Когда я добавляю пакет.net standardlib nuget в консоль.net fx, он работает. но тогда system.runtime будет доступен через GAC и через ссылку на nuget, что кажется мне довольно уродливым.
Я отправил это короткое тестовое решение сюда: https://github.com/Gentlehag/NetStandardSample
Что мне не хватает?
2 ответа
Я добавил репо, который показывает вам, как это сделать. С README.md:
Требования
Вообще говоря, использование библиотек с таргетингом на.NET Standard в приложении с таргетингом на.NET Framework требует, чтобы проект приложения включал ссылку NuGet для.NET Standard (
NETStandard.Library
). Это гарантирует, что правильный набор сборок включен в приложение.В Visual Studio 2015 стандартным способом использования пакетов NuGet из проектов.NET Framework является использование
packages.config
, Я не рекомендую этот путь, так как это означает, что все сборки напрямую внедряются в проект приложения, что значительно увеличивает размер файла вашего проекта. Вместо этого я рекомендую вам использоватьproject.json
, Для этого выполните следующие действия:
- Удалите все пакеты (если вы все еще используете
packages.config
)- Удалить пустое
packages.config
добавлять
project.json
файл с этим содержанием:
json { "dependencies": { "NETStandard.Library": "1.6.0" }, "runtimes": { "win": {} }, "frameworks": { "net462": {} } }
Обратите внимание, что вы можете зависеть от последней версии
NETStandard.Library
пакет, но вы должны убедиться, что псевдоним Framework синхронизирован с версией.NET Framework, на которую нацелено ваше приложение, т. е. когда вы нацеливаетесь на.NET Framework 4.6.1, вы должны обязательно использоватьnet461
вместо.Это чувствует себя неуклюжим
Да, это. Мы планируем решить эту проблему двумя способами:
Мы заменяем
project.json
с решением на основе MSBuild в Visual Studio 2017. Вам все еще нужно будет добавить ссылку наNETStandard.Library
, но вам больше не нужно связываться со способом представления пакетов и не нужно вручную синхронизировать информацию о таргетинге.Мы планируем обновить.NET Framework, чтобы в его будущей версии была встроенная поддержка.NET Standard, и в этом случае ссылка больше не понадобится.
Я обнаружил, что добавление NETStandard.Library
у меня не сработало, но гарантией того, что перенаправления связывания генерировались при сборке, было достаточно Для этого вы должны убедиться, что у вас есть
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
где-то в вашем файле проекта. Это должно работать для консоли или веб-приложений. Если у вас возникли проблемы с запуском модульных тестов, вы можете использовать это:
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
GenerateBindingRedirectsOutputType
необходим, поскольку модульные тесты содержатся в библиотеке классов, которая по умолчанию не имеет исполняемого файла, поэтому это заставляет любую конфигурацию перенаправления записываться в артефакты сборки, готовые для использования при выполнении тестов.
Вы можете найти более подробную информацию о проблемах здесь: https://github.com/dotnet/announcements/issues/31