【问题标题】:.NET application (WinForms) depending on ASP.NET Core server.NET 应用程序 (WinForms) 取决于 ASP.NET Core 服务器
【发布时间】:2018-09-11 19:45:51
【问题描述】:
   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 Standard 类库项目中。但我的问题是特定于 ASP.NET Core 的代码,比如从控制面板调用 Server.Start(),其中 Server 特定于 ASP.NET Core。

【问题讨论】:

    标签: .net visual-studio asp.net-core


    【解决方案1】:

    我建议您查看此处的表格:https://docs.microsoft.com/en-us/dotnet/standard/net-standard

    它通过针对不同版本的 .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 Standard 类库的引用添加到 WinForms 项目。

    将此库用于您需要在 WinForm 应用程序和网站之间共享的任何内容。

    编辑

    要从您的共享库访问 ASP.NET Core 功能,您可以添加 NuGet Microsoft.AspNetCore 或您需要的任何其他支持 .NET Standard 2.0 的包:

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

    【讨论】:

    • 是的,我可以共享一个.NET标准项目中的通用代码,但这并不能解决我无法从WinForms控制面板控制服务器的问题。例如我需要调用Server.Start(),但Server不是 .NET Standard,而是特定于 ASP.NET Core。
    • 顺便说一句,您为什么不使用 .NET 核心命令行命令从您的 winforms 应用程序启动和停止服务器?恕我直言,这会容易得多。
    • 如果可能,我希望有一个包含 ASP.NET Core 服务器的单个 exe 文件。(这有更多原因,例如,我需要 .NET Framework 中的一些其他功能,例如访问串口。)当然我可以使用命令行来控制一个单独的服务器exe。这就是我说“除了……使用某种形式的进程间通信”时的意思。我的下一个尝试是摆脱与 .NET Standard 不兼容的所有 ASP.NET Core 部分,如下所述:sourceallies.com/2016/12/… 我将在此处发布结果。
    • 我找到了解决办法,看我自己的回答。
    【解决方案2】:

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

    长答案:

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

    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 项目中,在Program.csMain 方法中,我通过调用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 中打开解决方案。现在我们看到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

    【讨论】:

    • 工作正常,但是我还必须安装其他用于服务器项目的 nuget 包
    【解决方案3】:

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

    【讨论】:

    • 请在 lsma 的回答下方查看我的评论,为什么这不能解决我的问题。
    猜你喜欢
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多