System.Net.Http в net47
У меня есть обычная библиотека классов в Windows, использующая.NET 4.7
Я хотел бы включить web-push-csharp.
Пакет перечисляет 2 допустимых зависимости (Newtonsoft Json и BouncyCastle). Также хочет установить Microsoft.Net.Http. И я понятия не имею, почему. Мне это не нужно Моя целевая структура поставляется с прекрасно System.Net.Http
для ссылки. Поскольку этот пакет Microsoft содержит список других зависимостей, которые конфликтуют с другими зависимостями, расположенными выше в моей цепочке, это огромное неудобство. Зачем мне включать пакет, который мне не нужен?
Теперь я подумал, что это не должно быть проблемой, пошел и клонировал веб-репозиторий push-пакетов, чтобы поместить мою целевую инфраструктуру и... это правильно, вы не можете скомпилировать для целевой инфраструктуры net47
без внешнего *.Net.Http
ссылка. Все же мой Create New Project
Проект.NET 4.7 уже поставляется с такой ссылкой, вообще не затрагивая nuget.
Копирование всех файлов пакетов в новую ClassLibrary1 прекрасно работает только с NewtonsoftJson и BouncyCastle.
Что мне здесь не хватает? Почему.NET Framework потерял свой System.Net.Http с 4,5 до 4,6? И почему нет доступной FrameworkTarget, где я могу сказать "это нормально, у меня полная версия 4.7"?
Есть ли другой вариант, кроме клонирования хранилища и создания из него обычной библиотеки классов 4.7 для моего использования?
Дополнительная информация:
Я клонировал репозиторий web-push-csharp и добавил новый целевой фреймворк net47
без какой-либо зависимости от Microsoft.Net.Http
:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netcoreapp1.0;netcoreapp1.1;netstandard1.3;net45;net46;net47</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net45' OR '$(TargetFramework)'=='net46'">
<PackageReference Include="BouncyCastle" Version="1.8.1" />
<PackageReference Include="Microsoft.Net.Http" Version="2.2.29" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net47'">
<PackageReference Include="BouncyCastle" Version="1.8.1" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='netcoreapp1.0' OR '$(TargetFramework)'=='netcoreapp1.1' OR '$(TargetFramework)'=='netstandard1.3'">
<PackageReference Include="BouncyCastle.NetCore" Version="1.8.1.3" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
</ItemGroup>
</Project>
Это приводит к множественным ошибкам компиляции по линии:
Ошибка CS0234 Тип или имя пространства имен "Http" не существует в пространстве имен "System.Net" (отсутствует ссылка на сборку?) WebPush(net47)
Решение
Для тех, кто читает это, ищет решение: после тестирования я включил принятый ответ в ветку ветки и отправил сопровождающему запрос Pull, чтобы его можно было использовать в оригинальном пакете.
2 ответа
Как вы сказали,.NET Framework (все упомянутые версии: 4.5, 4.6, 4.7) поставляется с System.Net.Http
Сборка готова к использованию, поэтому нет необходимости ссылаться на пакеты nuget. Но вам нужно сослаться на саму сборку:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netcoreapp1.0;netcoreapp1.1;netstandard1.3;net45;net46;net47</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net45' OR '$(TargetFramework)'=='net46'">
<PackageReference Include="BouncyCastle" Version="1.8.1" />
<!-- here -->
<Reference Include="System.Net.Http" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net47'">
<PackageReference Include="BouncyCastle" Version="1.8.1" />
<!-- and here -->
<Reference Include="System.Net.Http" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='netcoreapp1.0' OR '$(TargetFramework)'=='netcoreapp1.1' OR '$(TargetFramework)'=='netstandard1.3'">
<PackageReference Include="BouncyCastle.NetCore" Version="1.8.1.3" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
</ItemGroup>
</Project>
В файле nuspec они не упомянули о поддержке.NET 4.7 ( https://github.com/web-push-libs/web-push-csharp/blob/master/WebPush.nuspec) Возможно, вы можете взять клон репозиторий и добавьте изменить файл, как показано ниже
<?xml version="1.0"?>
<package >
<metadata>
<id>WebPush</id>
<version>1.0.9</version>
<authors>Cory Thompson</authors>
<owners>Cory Thompson</owners>
<licenseUrl>https://github.com/coryjthompson/web-push-csharp/blob/master/LICENSE</licenseUrl>
<projectUrl>https://github.com/coryjthompson/web-push-csharp/</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Web Push library for C#</description>
<copyright>Copyright 2017</copyright>
<tags>web push notifications vapid</tags>
<dependencies>
<group targetFramework="netcoreapp1.0">
<dependency id="BouncyCastle.NetCore" version="1.8.1.3"/>
<dependency id="Newtonsoft.Json" version="10.0.1"/>
</group>
<group targetFramework="netcoreapp1.1">
<dependency id="BouncyCastle.NetCore" version="1.8.1.3"/>
<dependency id="Newtonsoft.Json" version="10.0.1"/>
</group>
<group targetFramework="netstandard1.3">
<dependency id="BouncyCastle.NetCore" version="1.8.1.3"/>
<dependency id="Newtonsoft.Json" version="10.0.1"/>
</group>
<group targetFramework="net45">
<dependency id="BouncyCastle" version="1.8.1"/>
<dependency id="Microsoft.Net.Http" version="2.2.29" />
<dependency id="Newtonsoft.Json" version="10.0.1"/>
</group>
<group targetFramework="net46">
<dependency id="BouncyCastle" version="1.8.1"/>
<dependency id="Microsoft.Net.Http" version="2.2.29" />
<dependency id="Newtonsoft.Json" version="10.0.1"/>
</group>
<group targetFramework="net47">
<dependency id="BouncyCastle" version="1.8.1"/>
<dependency id="Microsoft.Net.Http" version="2.2.29" />
<dependency id="Newtonsoft.Json" version="10.0.1"/>
</group>
</dependencies>
</metadata>
</package>
и упакуйте свой собственный файл nuget и используйте его в своем проекте. https://programmium.wordpress.com/2014/05/26/keen-io-windows-phone-8-1-and-nuget-package-creation/ этот пост расскажет вам, как создать новый пакет nuget.