是否可以在 .NET Core 中制作桌面 GUI 应用程序?

Is it possible to make desktop GUI application in .NET Core?

几年来我一直在开发 Windows 表单程序。我现在正在研究 .NET Core(包括 ASP.NET Core MVC)。我正在寻找新的 GUI 桌面技术。在 Visual Studio 2015 更新 3 中,我看不到任何在 .NET Core 中制作 GUI 应用程序的选项。

我错过了什么?

你没有遗漏任何东西。在 .NET Core 3 之前,Microsoft 没有提供直接使用 .NET Core 创建 GUI 应用程序的合理方法,尽管 UWP(通用 Windows 平台)部分构建在 .NET Core 之上。

.NET Core 3.0 包括对 Windows 表单和 WPF 的支持,尽管它仅 Windows。

.NET 6 将包括 .NET MAUI,它将支持 Windows 和 macOS 桌面应用程序和移动应用程序,Linux 桌面应用程序由社区(非 MS)支持。 .NET 5 将包含 .NET MAUI 的预览版。

关于第三方跨平台选项,请参阅其他答案。

您可以使用 Electron and wire it up with Edge.js resp. electron-edge。 Edge.js 允许 Electron (Node.js) 调用 .NET DLL 文件,反之亦然。

通过这种方式,您可以使用 HTML、CSS 和 JavaScript 编写 GUI,并使用 .NET Core 编写后端。 Electron 本身也是跨平台的,并且基于 Chromium 浏览器。

一个选项是将 Electron 与 JavaScript、HTML 和 CSS 一起用于 UI,并构建一个 .NET Core 控制台应用程序,该应用程序将自托管一个web API 用于后端逻辑。 Electron 将在后台启动控制台应用程序,该应用程序将在 localhost:xxxx.

上公开服务

这样您就可以使用 .NET 实现所有后端逻辑,以便通过来自 JavaScript 的 HTTP 请求进行访问。

看看这个 post,它解释了 how to build a cross-platform desktop application with Electron and .NET Core and check code on GitHub

您可以使用 .NET Core 和 MVC 开发 Web 应用程序并将其封装在 Windows 通用 JavaScript 应用程序中:Progressive Web Apps on Windows

它仍然是一个 Web 应用程序,但它是一种非常轻量级的方式,可以将 Web 应用程序转换为桌面应用程序,而无需学习新框架 or/and 重新开发 UI,并且效果很好。

不便之处不同于 Electron or ReactXP 例如,结果是通用 Windows 应用程序而不是跨平台桌面应用程序。

AvaloniaUI 现在在 Windows、OS X 和 Linux 上支持在 .NET Core 之上的 运行ning。 XAML,包括绑定和控制模板。

例如使用 Rider 在 macOS 上开发:

  1. 按照说明install the Avalonia dotnet new templates
  2. 打开 JetBrains Rider 并从欢迎屏幕,
  3. 选择新解决方案→(靠近模板列表顶部)→更多模板 → 按钮安装模板...* → 浏览至您在步骤 1 中克隆模板的 目录
  4. 单击重新加载按钮
  5. 看哪! Avalonia 模板现在出现在 New Solution 模板列表中!
  6. 选择 Avalonia 模板
  7. 构建和 运行。看到 GUI 在您眼前打开。

tl;dr - 我不确定 .NET Core 开发人员是否有可能提供跨平台的 GUI 框架。

我希望将跨平台 GUI 框架捆绑到官方工具中(尤其是旧版本的工具 - 你提到你是 运行 Visual Studio 2015 update 3) .NET Core 的早期版本有点不成熟。

GUI 框架确实很重,并且依赖于主机上已经存在的硬件抽象。在 Windows 上,大多数用户通常使用一个 window 管理器 (WM) 和桌面环境 (DE),但在支持的 Linux 的许多不同发行版上,有任意数量的可能的 WM 和 DE - 授予大多数用户将使用 X-Server 或 Wayland in combination with KDE, GNOME or Xfce。但是没有 Linux 安装是一样的。

开源社区无法真正确定 VM 和 DE 的“标准”设置这一事实意味着 .NET Core 开发人员很难创建可跨平台运行的 GUI 框架所有平台以及 DE 和 WM 的组合。

这里的很多人都有一些很好的建议(从使用 ASP.NET Core 到构建 Web 应用程序,再到使用浏览器列出一堆跨平台框架)。如果您看一下列出的一些提到的跨平台 GUI 框架,您会发现它们有多么沉重。

然而,隧道尽头有曙光,因为今年 Miguel de Icaza showed off Xamarin running naively on Linux and macOS at .NET Conf(2017 年,如果您将来正在阅读这篇文章),所以在准备就绪时可能值得一试。

(但您需要从 Visual Studio 2015 升级到 Visual Studio 2017 才能访问 .NET Core 2.0 功能。)

是的,有可能。

.NET Core 没有开箱即用的本机 GUI 应用程序组件。但是,根据 Gregor Biswanger 的回答,有一个名为 Electron.NET 的 NuGet 包。

Electron 是一个允许您在 Node.js 之上构建本机 GUI 应用程序的框架。 Electron.NET 是一个 NuGet 包,允许您在 .NET Core 代码中使用 Electron 和 Node.js。

好消息是您无需学习 JavaScript、Electron 或 Node.js 即可使用 NuGet 包。 JS 文件在您的应用程序中 运行,但它们会在构建过程中自动生成。

您所做的只是构建一个非常标准的 ASP.NET 核心 MVC 应用程序。唯一的区别是,它不是在浏览器中 运行ning,而是作为本机窗口应用程序 运行s。除了 Electron.NET 包特定的几行代码外,您无需学习 ASP.NET Core MVC 以上的任何内容。

This page 提供了如何使用它的教程。它还包含一些示例代码存储库的链接。

现在可以在 .NET Core 中使用 Qt、QtQuick 和 QML,使用 Qml.Net

它具有高性能(不是“P/Invoke 喋喋不休”),功能齐全,适用于 Linux、OS X 和 Windows。

查看 my blog post 以了解它与当前其他选项的比较。

PS: 我是作者

对于 现有 Windows 表单应用程序的特殊情况

有一种方法 - 虽然我不知道它的效果如何。
它是这样的:
Mono 中获取 Windows Forms 实现。
将其移植到 .NET Core 或 NetStandard。

根据新 System.Windows.Forms 重新编译您的 Windows Forms 应用程序。
修复任何可能被 .NET Core 破坏的内容。
祈祷 mono 完美地实现你需要的部分。
(如果没有,您可以随时停止祈祷,并使用您的 fix/patch/feature 向 Mono 项目发送拉取请求。)

这是我的 CoreFX Windows 表单存储库:
https://github.com/ststeiger/System.CoreFX.Forms

.NET Core 3 将支持创建 Windows 桌面应用程序。我昨天在 .NET 会议期间观看了该技术的演示。

这是我唯一能找到的博客 post,但它确实说明了这一点:.NET Core 3 and Support for Windows Desktop Applications

我正在做一个可能有帮助的项目:https://github.com/gkmo/CarloSharp

以下应用程序是用 .NET 编写的,在 HTML、JavaScript 和 CSS (Angular) 中包含 UI。

是的,可以使用 Visual Studio 代码、.NET Core、C#、Windows、Linux 和 macOS 开发跨平台桌面 (GUI) 应用程序, GTK 3,gtksharp 和 Glade 作为 GUI 设计器。

这里是how.

要创建基于控制台的 UI,您可以使用 gui.cs. It is open-source (from Miguel de Icaza, creator of Xamarin),并在 Windows、Linux 和 macOS 上的 .NET Core 上运行。

它有以下组成部分:

  • 按钮
  • 标签
  • 文字输入
  • 文本视图
  • 时间编辑字段
  • 单选按钮
  • 复选框
  • 对话框
    • 消息框
  • Windows
  • 菜单
  • 列表视图
  • 帧数
  • 进度条
  • 滚动视图和滚动条
  • 十六进制viewer/editor (HexView)

示例屏幕截图

如果您使用的是 .NET Core 3.0 及更高版本,请执行以下步骤即可:(我将使用 .NET Core CLI,但您也可以使用 Visual Studio ):

  1. md MyWinFormsApp 可选步骤
  2. cd MyWinFormsApp 可选步骤
  3. dotnet new sln -n MyWinFormsApp 可选步骤,但这是个好主意
  4. dotnet new winforms -n MyWinFormsApp 对不起,这不是可选的
  5. dotnet sln add MyWinFormsApp 如果您执行了第 3 步,请执行此操作

好的,您可以停止阅读我的回答并开始向 MyWinFormsApp 项目添加代码。但如果您想使用 Form Designer,请继续阅读。

  1. 打开 MyWinFormsApp.csproj 文件并将 <TargetFramework>netcoreapp3.1<TargetFramework> 更改为 <TargetFrameworks>net472;netcoreapp3.1</TargetFrameworks>(如果您使用的是 netcoreapp3.0,请不要担心。将其更改为 <TargetFrameworks>net472;netcoreapp3.0</TargetFrameworks>
  2. 然后添加以下内容ItemGroup
  <ItemGroup Condition="'$(TargetFramework)' == 'net472'">
    <Compile Update="Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Update="Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
  </ItemGroup>

完成这些步骤后,您应该得到以下结果:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFrameworks>net472;netcoreapp3.1</TargetFrameworks>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net472'">
    <Compile Update="Form1.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Update="Form1.Designer.cs">
      <DependentUpon>Form1.cs</DependentUpon>
    </Compile>
  </ItemGroup>

</Project>
  1. 打开文件 Program.cs 并添加以下内容 preprocessor-if
#if NETCOREAPP3_1
    Application.SetHighDpiMode(HighDpiMode.SystemAware);
#endif

现在你可以使用Visual Studio 2019打开MyWinFormsApp项目(我想你也可以使用Visual Studio 2017,但我不确定) 并双击 Form1.cs,您应该会看到:

好了,打开工具箱(Ctrl + W, X)开始添加控制您的应用程序并使其美观。

您可以在 Windows Forms .NET Core Designer 阅读更多关于设计师的信息。

Windows 自 Visual Studio 2019 16.6 以来,表单(及其可视化设计器)已可用于 .NET Core(作为预览版)。很好,虽然有时我需要打开 Visual Studio 2019 16.7 Preview 来解决烦人的错误。

查看此博客 post:Windows Forms Designer for .NET Core Released

此外,Windows Forms 现已开源:https://github.com/dotnet/winforms

我一直在寻找这个问题,none 上面的解决方案令我满意。

我现在结束了 https://github.com/mellinoe/ImGui.NET 的工作。

我可以确认它至少适用于 macOS 和 win10,并声称与 linux 兼容。

把它留在这里以防它能帮助到别人。

它将在 .NET 6 中可用: https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/

但您已经可以使用 netcore 3.1 和 net 5 创建 WinForms 应用程序(至少在 Visual Studio 2019 16.8.4+ 中)。