Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET应用程序(WinForms)依赖于ASP.NET核心服务器_.net_Visual Studio_Asp.net Core - Fatal编程技术网

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

.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

我有一个使用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核心特定的代码,比如说从控制面板调用
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核心功能,可以添加NuGet
Microsoft.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 ⚡