.NET应用程序(WinForms)取决于ASP.NET核心服务器

问题描述 投票:1回答:3
   Control Panel     ----------->        Server
  .NET Framework      depends on      ASP.NET Core
                       ⚡ FAIL ⚡ 

我有一个使用ASP.NET Core 2.1构建的Web服务器,因为它应该在普通台式计算机(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标准类库项目中。但我的问题是ASP.NET Core特定代码,比如从控制面板调用Server.Start(),其中Server特定于ASP.NET Core。

.net visual-studio asp.net-core
3个回答
2
投票

我建议你看看这里的表格:https://docs.microsoft.com/en-us/dotnet/standard/net-standard

它通过针对不同版本的.NET标准规范描述了每个平台的可能组合。

这是让它适合你的一种可能方法。

在Visual Studio解决方案中,创建ASP.NET核心Web应用程序,在我的测试中,我使用.NET Core 2.0作为目标。

然后创建一个面向.NET Standard 2.0的新类库:

.NET Standard Class Library

将此库的引用添加到ASP.NET Web应用程序。

然后添加你的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

您可能还需要向WinForms项目添加一些NuGet包,同样的原则适用,只要您定位.NET Framework 4.6.1并且您的NuGet包支持.NET Standard 2.0它应该可以工作。


1
投票

TL; DR:对ASP.NET Core服务器使用“.NET Standard”项目,并在WinForms项目上也安装ASP.NET Core依赖项。

答案很长:

问题是,Visual Studio基于“.NET Core”创建ASP.NET Core项目,但不是“.NET Standard”。所以我们不能依赖它。但我们可以改变这一点。这是整个项目设置:

1)作为控制面板项目,使用WinForms(“.NET Framework”)项目创建解决方案。我们称之为WinForms项目。

2)将ASP.NET Core Web应用程序项目添加到解决方案中。我们称之为Server。作为模板,选择“API”模板并选择“.NET Core”版本“ASP.Net Core 2.1”。

3)在WinForms项目中,添加对Server项目的依赖。通过调用Server.Program.Main(new string[0]);添加一行来启动服务器

4)在Server项目中,在MainProgram.cs方法中,我通过调用RunAsync()而不是Run()来启动web主机,这样调用不会阻塞,我的Winforms项目将能够继续。

当您尝试现在编译WinForms项目时,您会看到我在我的问题中描述的错误:“.NET Framework”项目不接受“.NET Core”项目作为依赖项。幸运的是,Server项目实际上符合“.NET标准”,所以我们现在可以改变它:

4)关闭Visual Studio。在文本编辑器中打开Server.csproj并用<TargetFramework>netcoreapp2.1</TargetFramework>替换<TargetFramework>netstandard2.0</TargetFramework>行。

5)再次在Visual Studio中打开解决方案。现在我们在Server项目中看到了NuGet包的问题。打开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
投票

这正是.NET Standard存在的原因。创建.NET Standard 2.0类库项目。然后,移动所有常用功能。最后,让.NET Framework和.NET Core项目引用该类库。

© www.soinside.com 2019 - 2024. All rights reserved.