Я хочу разместить в Nuget основанное на фреймворке межплатформенное консольное приложение , которое затем может быть запущено как фоновый процесс любым потребляющим .dll (библиотекой классов) .NET Full, .NET Standard или.Библиотека классов NET Core, как показано ниже.
Для этого я создал консольный проект в VS 2017 MyConsole , которыйпредназначен как для .NET Core, так и для .Net Full framework
<TargetFrameworks>netcoreapp2.2;net461</TargetFrameworks>
Затем сделал этот пакет инструментов Nuget
<PropertyGroup>
<IncludeBuildOuput>true</IncludeBuildOuput>
<BuildOutputTargetFolder>tools</BuildOutputTargetFolder>
</PropertyGroup>
<!-- Include target and props in tools -->
<ItemGroup>
<None Include="tools\**" Pack="true" PackagePath="tools\" />
</ItemGroup>
Указал MSBuild опубликовать выходные данные сборки перед генерациейПакет NuGet для соответствующей многоцелевой платформы и включил опубликованные результаты в пакет инструментов, как показано ниже.
<!--TargetsForTfmSpecificBuildOutput-->
<PropertyGroup>
<TargetsForTfmSpecificBuildOutput>
$(TargetsForTfmSpecificBuildOutput);GatherTargetSpecificBuildOutput
</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>
<Target Name="GatherTargetSpecificBuildOutput">
<ItemGroup>
<BuildOutputInPackage Include="$(MyConsoleOutputFolder)*.dll"
</BuildOutputInPackage>
</ItemGroup>
</Target>
<Target Name="PublishAll" BeforeTargets="GenerateNuspec">
<ItemGroup>
<_TargetFramework Include="$(TargetFrameworks)" />
</ItemGroup>
<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" Properties="TargetFramework=%(_TargetFramework.Identity)" />
</Target>
После этого я успешно создал пакет инструментов консоли Nuget.
Теперь главное - использовать пакет консоли Nuget.
Для этого мне пришлось установить MyConsole из NuGet в библиотеку потребляющих классов.Я пометил ссылку на пакет как частный ресурс, чтобы мы могли запустить консоль, но он не должен быть подвержен родительским проектам, использующим dll.
<PackageReference Include="MyConsole" Version="2.1.19-alpha">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
Вопросы:
- Это правильный подход или вы рекомендуете какой-нибудь другой лучший подход?
Проблемы, с которыми я сталкиваюсь:
- Чтобы сделать это, я добавил PackageReference из MyConsole в мою библиотеку классов потребления (это противоречит ссылкам на консоль в библиотеке).
- Если я не добавлю ссылку на пакет MyConsoleу моего потребляющего dll нет возможности определить и загрузить пакет MyConsole из Nuget
- . Этот хорошо работает для библиотек .NET Standard и .NET, использующих ядро , и я могузапустить консольное приложение MyConsole в фоновом режиме.Но .NET Full dll запускает консоль , и я вижу окно консоли, но выдает ошибку для зависимой сборки «Не удалось загрузить файл или сборку» (длянапример, NewtonSoft.Json 6.0.0.0)
Я застрял в этой точке, любая помощь будет высоко оценена!