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。
我建议你看看这里的表格:https://docs.microsoft.com/en-us/dotnet/standard/net-standard
它通过针对不同版本的.NET标准规范描述了每个平台的可能组合。
这是让它适合你的一种可能方法。
在Visual Studio解决方案中,创建ASP.NET核心Web应用程序,在我的测试中,我使用.NET Core 2.0作为目标。
然后创建一个面向.NET Standard 2.0的新类库:
将此库的引用添加到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所需的任何其他软件包:
您可能还需要向WinForms项目添加一些NuGet包,同样的原则适用,只要您定位.NET Framework 4.6.1并且您的NuGet包支持.NET Standard 2.0它应该可以工作。
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
项目中,在Main
的Program.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
这正是.NET Standard存在的原因。创建.NET Standard 2.0类库项目。然后,移动所有常用功能。最后,让.NET Framework和.NET Core项目引用该类库。