.NET应用程序(WinForms)依赖于ASP.NET核心服务器
我有一个使用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应用程序(WinForms)依赖于ASP.NET核心服务器,.net,visual-studio,asp.net-core,.net,Visual Studio,Asp.net Core,我有一个使用ASP.NET Core 2.1构建的web服务器,因为它应该在普通桌面计算机(Windows 10)和Raspberry Pi(Windows 10 IoT Core)上运行。到目前为止效果很好 如果服务器在桌面计算机上运行,我想为服务器提供一个基于WinForms(.NET Framework 4.7)的控制面板。因此(以及桌面版本所需的其他附加功能),我使用.NET Framework 4.7创建了第二个项目,其中包括作为依赖项的服务器项目 不幸的是,这不起作用。Visual
编辑:我知道我可以将共享代码移动到.NET标准类库项目中。但是我的问题是ASP.NET核心特定的代码,比如说从控制面板调用
Server.Start()
,其中Server
特定于ASP.NET核心。这就是存在的原因。创建.NET标准2.0类库项目。然后,将所有常用功能移到那里。最后,让您的.NET Framework和.NET核心项目都引用该类库。我建议您查看以下表格:
它通过针对不同版本的.NET标准规范来描述每个平台的可能组合
这里有一个可能的方法让它为你工作
在Visual Studio解决方案中,创建ASP.NET Core Web应用程序,在我的测试中,我使用.NET Core 2.0作为目标
然后创建一个针对.NET Standard 2.0的新类库:
将对此库的引用添加到ASP.NET Web应用程序中
然后添加WinForms项目,根据上表,它的目标应该是.NET Framework 4.6.1,而不是.NET Framework 4.7(我认为使用WinForms的最新版本没有任何好处)
然后将对.NET标准类库的引用添加到WinForms项目中
使用此库可以获取需要在WinForm应用程序和网站之间共享的任何内容
编辑
要从共享库访问ASP.NET核心功能,可以添加NuGetMicrosoft.AspNetCore
或支持.NET标准2.0的任何其他软件包:
您可能还需要向WinForms项目中添加一些NuGet软件包,这一原则同样适用,只要您的目标是.NET Framework 4.6.1,并且您的NuGet软件包支持.NET标准2.0,它就应该可以工作。TL;DR:对ASP.NET核心服务器使用“.NET标准”项目,并在WinForms项目上安装ASP.NET核心依赖项。
长答覆:
问题是,Visual Studio创建的ASP.NET核心项目基于“.NET核心”,而不是“.NET标准”。因此,我们不能依赖它。但我们可以改变这一点。这是整个项目设置:
1) 作为控制面板项目,使用WinForms(“.NET Framework”)项目创建解决方案。让我们调用项目WinForms
2) 将ASP.NET核心web应用程序项目添加到解决方案中。让我们称之为服务器。作为模板,选择“API”模板并选择“.NET Core”版本“ASP.NET Core 2.1”
3) 在WinForms
项目中,添加对Server
项目的依赖项。通过调用server.Program.Main(新字符串[0]),添加一行用于启动服务器代码>
4) 在Server
项目中,在Program.cs
的Main
方法中,我通过调用RunAsync()
而不是Run()
来启动web主机,这样调用就不会阻塞,我的Winforms项目将能够继续
当您现在尝试编译WinForms
project时,您会看到我在问题中描述的错误:“.NET Framework”项目不接受“.NET Core”项目作为依赖项。幸运的是,服务器
项目实际上符合“.NET标准”,因此我们现在可以改变这一点:
4) 关闭VisualStudio。在文本编辑器中打开Server.csproj
,将行netcoreapp2.1
替换为netstandard2.0
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是的,我可以在.NET标准项目中共享公共代码,但这并不能解决我无法从WinForms控制面板控制服务器的问题。例如,我需要调用Server.Start()
,但是Server
类不是.NET标准,而是特定于ASP.NET Core的。顺便问一下,为什么不使用.NET Core命令行commads来启动和停止
Control Panel -----------> Server
.NET Framework depends on ASP.NET Core
⚡ FAIL ⚡