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

Posted

技术标签:

【中文标题】是否可以在 .NET Core 中制作桌面 GUI 应用程序?【英文标题】:Is it possible to make desktop GUI application in .NET Core? 【发布时间】:2016-09-22 22:43:52 【问题描述】:

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

我错过了什么?

【问题讨论】:

你应该换个角度看这个新平台。每个现有框架,WPF/WinForms/UWP/GTK#/Xamarin.Mac/ios/android 都可以使用您在 .NET Core 上编写的代码。这使得跨平台开发成为可能,只是不像你想象的那样。 所以你是说我可以在 - 例如 - winforms 和 .net core 中构建 GUI 和后端代码 电子是要走的路。在 api 后面使用 asp.net。如果您保持 ui 逻辑轻,您应该能够将应用程序的最重要部分保留在 .net 上 作为专业提示,我会升级到 Visual Studio 2017(如果可能)或使用其他可用工具(CLI 和/或 VS Code/Rider),因为 VS 2015 无法访问.NET Core 2.0 工具,这将阻碍您的开发。即使你所做的只是试验它。 我不明白 UWP 的意义所在。我想在 Windows 和 Mac 上运行我的 .NET/WPF 应用程序。我不关心 Hololens、xbox、Surface Hub 等。 【参考方案1】:

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

.NET Core 3.0 包括对 Windows 窗体和 WPF 的支持,但它仅适用于 Windows。

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

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

【讨论】:

天哪,真是震惊!那么没有 GUI 的跨平台框架有什么意义呢? @EssamGndelee 重点是 ASP.NET Core 应用程序。第二点是控制台应用程序。 @ChristopherPainter 更好地支持云计算并吸引来自 Node.js 等平台的开发人员是 .Net Core 存在的部分原因,是的。但这并不意味着微软现在只关心这些。 @CYoung 我认为微软的立场是你应该为此使用 UWP。 @svick,这将完全消除 .NET Core 应该解决的任何跨平台编程。 UWP 仅适用于 MS 家庭:/【参考方案2】:

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

例如使用 Rider 在 macOS 上开发:

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

【讨论】:

顺便说一句,任何有兴趣的人请投票支持 Jetbrains 以在 Rider 中包含 Avalonia 支持:youtrack.jetbrains.com/issue/RIDER-39247【参考方案3】:

您可以使用 Electron 并将其分别与 Edge.js 连接起来。 electron-edge。 Edge.js 允许 Electron (Node.js) 调用 .NET DLL 文件,反之亦然。

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

【讨论】:

但是为什么是电子?您也可以在端口 X 上打开一个 Web 应用程序,然后将浏览器导航到那里。包括 Electron 所能提供的一切,以及更多,因为它始终是浏览器的最新版本——与 Electron 不同。如果您需要特定的浏览器版本,请在您的发行版中包含 Google-Chrome。 @StefanSteiger 我认为使用电子并直接通过程序集调用 API 将填补用户不会将应用程序视为 Web 应用程序的空白。并且一些开发者不想使用 HTTP 添加更多的通信层。 Electron.Net 现在看起来很简单cross-platform-blog.com/electron.net/… Electron.NET 看起来很有前途,但我会厌倦在生产中使用它,因为它会迫使您在生产机器上打开不安全的 Web 服务器。再说一次,只要应用程序的 ASP.NET Core 端位于正确配置的反向代理服务器(如 IIS 或 nginx(或类似)之后),那么您应该更安全。 地狱可以只是将应用程序作为 mvc/webapi,在随机端口上本地托管,并使用电子接口调用本地 api。【参考方案4】:

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

它是高性能的(不是“P/Invokechatty”),功能齐全,可在 Linux、OS X 和 Windows 上运行。

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

PS:我是作者。

【讨论】:

看起来很有希望,我会研究一下【参考方案5】:

要创建基于控制台的 UI,您可以使用 gui.cs。它是开源的(来自 Miguel de Icaza,Xamarin 的创建者),可在 Windows、Linux 和 macOS 上的 .NET Core 上运行。

它有以下组件:

按钮 标签 文字输入 文本视图 时间编辑字段 单选按钮 复选框 对话框 消息框 窗户 菜单 列表视图 框架 进度条 滚动视图和滚动条 十六进制查看器/编辑器 (HexView)

示例截图

【讨论】:

【参考方案6】:

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

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

看看这篇文章,它解释了how to build a cross-platform desktop application with Electron and .NET Core并检查GitHub上的代码。

【讨论】:

【参考方案7】:

是的,有可能。

.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 Core MVC 应用程序。唯一的区别是,它不是在浏览器中运行,而是作为本机窗口应用程序运行。除了特定于 Electron.NET 包的几行代码之外,您无需学习 ASP.NET Core MVC 之上的任何内容。

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

以下应用程序是用 .NET 编写的,其 UI 采用 HTML、JavaScript 和 CSS (Angular)。

【讨论】:

请不要使用 HTML。 @Richard Lalancette:为什么?你能详细说明吗? Visual Studio Code 不是一个例子吗? 这只是桌面应用程序的可怕技术。显然,这取决于您想要的性能和质量水平。【参考方案10】:

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

我希望将跨平台 GUI 框架捆绑到早期版本的 .NET Core 官方工具中(尤其是旧版本的工具 - 您提到您正在运行 Visual Studio 2015 更新 3)有点早了。

GUI 框架确实很重,并且依赖于主机上已经存在的硬件抽象。在 Windows 上,大多数用户通常使用单个窗口管理器 (WM) 和桌面环境 (DE),但在支持的许多不同 Linux 发行版上,可能存在任意数量的 WM 和 DE——大多数用户都会使用 X-Server 或 Wayland 与 KDE、GNOME 或 Xfce 结合使用。但是没有任何 Linux 安装是相同的。

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

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

但是,今年(2017 年,如果您将来阅读本文),隧道尽头有光,就像 Miguel de Icaza showed off Xamarin running naively on Linux and macOS at .NET Conf,所以当它准备好时可能值得一试。

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

【讨论】:

没有理由解释 Linux 的多样性。 1. Java 运行流畅 2. Mono 正常运行 WinForms(你丑) 在 linux 中,您可以在基于 QT 的发行版上使用 GTK,反之亦然。为 .net core 提供 QT 绑定会很酷。 我同意你所说的一切。但是,我觉得微软目前的做法是通过其Azure平台提供IaaS(基础设施即服务)、SaaS(软件即服务)和PaaS(平台即服务)。他们的第一方开源跨平台框架将把开发人员作为优先方向指向这个方向是有道理的。 Azure 和 RHEL 和 Google 等其他公司为支持 ASP NET Core 和 .NET Core 所做的工作几乎是传奇,而 .NET Core 的优先级似乎反映了这一点。【参考方案11】:

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

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

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

【讨论】:

【参考方案12】:

我已经找了很久了,上面的解决方案都没有让我满意。

我最终暂时使用https://github.com/mellinoe/ImGui.NET。

我可以确认它至少可以在 macos 和 win10 上运行,并声称与 linux 兼容。

把这个留在这里,以防它可以帮助别人。

【讨论】:

有根游戏相关,这东西..我胆小的猜它只是一帧一帧地重绘整个东西?或者(你不知道吗?)它只更新必须更新/重绘的元素?如果是这样会很酷.. 没错。每个帧都在处理所有元素。我相信如果没有任何变化,就会有一个缓存。一直用它来创建后效插件,它非常可爱。它确实有一些弱点。【参考方案13】:

对于现有 Windows 窗体应用程序的特殊情况:

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

针对新的 System.Windows.Forms 重新编译您的 Windows 窗体应用程序。 修复任何可能被 .NET Core 破坏的东西。 祈祷单声道完美地实现您需要的部分。 (如果没有,您可以随时停止祈祷,并向 Mono 项目发送包含您的修复/补丁/功能的拉取请求。)

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

【讨论】:

【参考方案14】:

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

这里是how。

【讨论】:

【参考方案15】:

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

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

【讨论】:

【参考方案16】:

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

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

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

    打开MyWinFormsApp.csproj文件并将<TargetFramework>netcoreapp3.1<TargetFramework>更改为<TargetFrameworks>net472;netcoreapp3.1</TargetFrameworks>(如果您使用的是netcoreapp3.0,请不要担心。将其更改为<TargetFrameworks>net472;netcoreapp3.0</TargetFrameworks>) 然后添加以下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>
    打开文件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 了解更多关于设计师的信息。

【讨论】:

【参考方案17】:

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

查看这篇博文:Windows Forms Designer for .NET Core Released

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

【讨论】:

在 Windows 上,而不是 Linux(?)。从来没有说过。 是的,目前只有 Windows。使用 .Net 6,事情会变得更好。【参考方案18】:

如果您有耐心,.net maui 有时会在秋季推出 .net 6.0!

那应该很棒!

【讨论】:

以上是关于是否可以在 .NET Core 中制作桌面 GUI 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

无法在通用 Windows 或 WPF 应用程序中引用 .NET Core 类库

在 java 中转换 MFC 桌面应用程序 GUI

.NET Core 3 使用 WinUI

适用于 Windows 的桌面应用程序 - .NET Core 或 .NET Framework

asp.net core 拦击器制作的权限管理系统DEMO

是否可以使用 JavaFX 和 Swing 制作具有视觉吸引力的 GUI?