Приложение .NET (WinForms) в зависимости от сервера ASP.NET Core - PullRequest
0 голосов
/ 11 сентября 2018
   Control Panel     ----------->        Server
  .NET Framework      depends on      ASP.NET Core
                       ⚡ FAIL ⚡ 

У меня есть веб-сервер, построенный на ASP.NET Core 2.1, поскольку он должен работать как на обычном настольном компьютере (Windows 10), так и на Raspberry Pi (Windows 10 IoT Core). Пока работает отлично.

На тот случай, если сервер работает на настольном компьютере, я хочу предоставить панель управления для сервера на основе WinForms (.NET Framework 4.7). Поэтому (и для других дополнительных функций, необходимых для настольной версии) я создал второй проект с использованием .NET Framework 4.7, который включает в себя серверный проект в качестве зависимости.

К сожалению, это не работает. Visual Studio сообщает мне, что целевая версия "netcoreapp2.1" сервера не совместима с версией ".NETFramework, Version = v4.7" панели управления. Также ссылка на серверную DLL вместо проекта не работает (компилируется нормально, но ошибка времени выполнения при вызове сервера).

Есть ли элегантное решение (помимо создания двух отдельных exe-файлов и использования какой-либо формы межпроцессного взаимодействия)?

РЕДАКТИРОВАТЬ: Я знаю, что могу переместить общий код в проект библиотеки классов .NET Standard. Но моя проблема заключается в специфичном для ASP.NET Core коде, как, например, вызов Server.Start() из панели управления, где Server относится к ASP.NET Core.

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Рекомендую взглянуть на таблицу, доступную здесь: https://docs.microsoft.com/en-us/dotnet/standard/net-standard

Описывает возможные комбинации для каждой платформы, ориентируясь на разные версии стандартной спецификации .NET.

Вот один из возможных способов заставить его работать на вас.

В вашем решении Visual Studio создайте веб-приложение ASP.NET Core, в моем тесте я использовал .NET Core 2.0 в качестве цели.

Затем создайте новую библиотеку классов, предназначенную для .NET Standard 2.0:

.NET Standard Class Library

Добавьте ссылку на эту библиотеку в ваше веб-приложение ASP.NET.

Затем добавьте ваш проект WinForms, в соответствии с таблицей выше, он должен быть нацелен на .NET Framework 4.6.1 , а не на .NET Framework 4.7 (я не думаю, что есть какая-либо польза от использования последней версии для WinForms в любом случае).

Затем добавьте ссылку на библиотеку классов .NET Standard в проект WinForms.

Используйте эту библиотеку для всего, что вам нужно для обмена между приложением WinForm и веб-сайтом.

Редактировать

Чтобы получить доступ к функциональности ASP.NET Core из общей библиотеки, вы можете добавить NuGet Microsoft.AspNetCore или любой другой необходимый вам пакет, поддерживающий .NET Standard 2.0:

NuGet .NET Standard

Вам также может понадобиться добавить несколько пакетов NuGet в ваши проекты WinForms, тот же принцип применим, если вы нацелены на .NET Framework 4.6.1 и ваши пакеты NuGet поддерживают .NET Standard 2.0, это должно работать.

0 голосов
/ 12 сентября 2018

TL; DR: используйте проект «.NET Standard» для сервера ASP.NET Core и установите зависимости ASP.NET Core также в проекте WinForms.

Длинный ответ:

Проблема в том, что Visual Studio создает проект ASP.NET Core на основе ".NET Core", но не на ".NET Standard".Поэтому мы не можем зависеть от этого.Но мы можем изменить это.Это полная настройка проекта:

1) В качестве проекта панели управления создайте решение с проектом WinForms (.NET Framework).Давайте назовем проект WinForms.

2) Добавьте в решение проект веб-приложения ASP.NET Core.Давайте назовем это Server.В качестве шаблона выберите шаблон «API» и выберите версию «.NET Core» «ASP.Net Core 2.1».

3) В проекте WinForms добавьте зависимость к проекту Server.Добавьте строку для запуска сервера, вызвав Server.Program.Main(new string[0]);

4) В проекте Server, в методе Main Program.cs, я запускаю веб-хост, вызывая RunAsync() вместоRun(), чтобы вызов не блокировался, и мой проект Winforms смог продолжить.

Когда вы пытаетесь скомпилировать проект WinForms сейчас, вы видите именно ту ошибку, которую я описал в своем вопросе:Проект ".NET Framework" не принимает проект ".NET Core" в качестве зависимости.К счастью, проект Server фактически соответствует стандарту .NET, поэтому мы можем изменить это сейчас:

4) Закройте Visual Studio.Откройте Server.csproj в текстовом редакторе и замените строку <TargetFramework>netcoreapp2.1</TargetFramework> на <TargetFramework>netstandard2.0</TargetFramework>.

5) Снова откройте решение в Visual Studio.Теперь мы видим проблемы с пакетами NuGet в проекте Server.Откройте диспетчер пакетов NuGet и удалите «Microsoft.AspNetCore.App».Вместо этого установите «Microsoft.AspNetCore» и «Microsoft.AspNetCore.Mvc».Если вы посмотрите на их зависимости, вы увидите, что они оба соответствуют стандарту .NET.

6) Теперь решение компилируется нормально.Но при запуске проекта WinForms я получаю исключение времени выполнения при вызове сервера.Некоторые файлы сборки отсутствуют.Я думаю, это потому, что нам нужны варианты .NET Framework для этих файлов сборки.

7) Поэтому в проекте WinForms также откройте диспетчер пакетов NuGet и установите обе зависимости "Microsoft.AspNetCore"и" Microsoft.AspNetCore.Mvc "там тоже!Вы увидите, что загружены варианты .NET Framework.

8) Запустите проект WinForms, и теперь он работает: -D

0 голосов
/ 11 сентября 2018

Именно поэтому существует .NET Standard . Создайте проект библиотеки классов .NET Standard 2.0. Затем переместите туда все обычные функции. Наконец, ваши проекты .NET Framework и .NET Core должны ссылаться на эту библиотеку классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...