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

时间:2016-09-22 22:43:52

标签: .net-core coreclr

我一直在开发winforms程序几年。我现在正在研究.NET核心(包括ASP.NET核心MVC)。我正在寻找新的GUI桌面技术。在visual studio 2015 update 3我不能看到在.NET核心中制作GUI应用程序的任何选项。我错过了什么?

19 个答案:

答案 0 :(得分:38)

你没有遗漏任何东西。目前,没有合理的方法直接使用.Net Core创建GUI应用程序。

虽然UWP(通用Windows平台)部分构建在.Net Core之上。

此外,.Net Core 3.0(每日构建已经可用)将包括对Winforms和WPF的支持,尽管它只是Windows。

答案 1 :(得分:35)

您可以使用Electron并将其与Edge.js分享。 electron-edge。 Edge.js允许电子(node.js)调用.net dll,反之亦然。 这样,您可以使用HTML,CSS和JavaScript编写GUI,使用.net核心编写后端。 Electron本身也是跨平台的,基于铬浏览器。

答案 2 :(得分:18)

一种选择是使用带有JavaScript,HTML和CSS的Electron用于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上的代码

答案 3 :(得分:16)

AvaloniaUI现在支持在Win / OSX / Linux上运行.NET Core。包括XAML,绑定和控制模板。

答案 4 :(得分:12)

我们使用.net核心编写了一个开源的电子解决方案: Electron.NET https://github.com/ElectronNET/Electron.NET

享受!

答案 5 :(得分:10)

现在可以使用Qml.Net将Qt / QtQuick / QML与.NET Core一起使用。

它是高性能(不是“ pinvoke chatty”),功能齐全,并且可以在Linux / OSX / Windows上运行。

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

PS:我是作者。

答案 6 :(得分:9)

要创建基于控制台的UI,可以使用gui.cs。它是开源的(来自Xamarin的创建者Miguel),并且在Windows,Linux和MacO的.Net内核上运行。

它包含以下组件:

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

示例屏幕截图

gui.cs sample output screenshot

答案 7 :(得分:5)

.NET Core 3将支持创建Windows桌面应用程序。我昨天在.NET会议上观看了该技术的演示。这是我唯一能找到的博客文章,但确实说明了这一点:https://blogs.msdn.microsoft.com/dotnet/2018/05/07/net-core-3-and-support-for-windows-desktop-applications/

答案 8 :(得分:2)

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

我觉得期待一个跨平台的GUI框架被捆绑到官方工具(特别是工具的旧版本 - 你提到你正在运行VS 2015更新3)的早期版本的.NET Core有点不成熟。

GUI框架非常繁重,并且依赖于主机上已存在的硬件抽象。在Windows上,大多数用户通常使用单个窗口管理器(WM)和桌面环境(DE),但是在支持的许多不同的Linux发行版上,有许多可能的WM和DE - 授予大多数用户要么将X-Server或Wayland与KDE,Gnome或XFCE结合使用。但是,Linux的安装并不相同。

开源社区无法真正满足"标准"设置VM和DE意味着.NET Core开发人员很难创建一个可以跨所有平台以及DE和WM组合工作的GUI框架。

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

然而,今年隧道尽头有Miguel de Icaza showed off Xamarin running naively on Linux and MacOS at .NET Conf的亮点(2017年,如果您将来再读这篇文章的话),所以当它“#3”}时,可能值得尝试。准备好了。

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

答案 9 :(得分:2)

这是一个古老的问题,但是可以,可以使用VSCode,.Net Core,C#,gtk3,gtksharp和Glade作为GUI Designer,为Windows,Linux和macOS开发跨平台桌面(GUI)应用程序。

这里是how

答案 10 :(得分:2)

我多年来一直在寻找这个,但上述解决方案都没有让我满意。

我暂时与 https://github.com/mellinoe/ImGui.NET 合作。

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

留在这里以防它可以帮助某人。

enter image description here

答案 11 :(得分:1)

您可以使用.NET Core和MVC开发Web应用程序,并将其封装在Windows通用JavaScript应用程序中:https://docs.microsoft.com/en-us/windows/uwp/porting/hwa-create-windows

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

不便之处与electronReactXP不同,例如,结果是一个通用的Windows应用,而不是跨平台的桌面应用。

答案 12 :(得分:1)

是的,有可能。

.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提供了有关如何使用它的教程。它还包含一些指向示例代码存储库的链接。

答案 13 :(得分:1)

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

以下应用程序是使用.net编写的,UI是HTML / JS / CSS(角度)

enter image description here

答案 14 :(得分:1)

它将使用 .NET 6 提供: https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/

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

Create winforms app sample

UI Constructor available

答案 15 :(得分:0)

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

那应该很棒!

答案 16 :(得分:0)

自Visual Studio 2019 16.6起,Windows窗体(及其视觉设计器)就已经可用于.NET Core(作为预览)。很好,尽管有时我需要打开Visual Studio 2019 16.7预览版来解决烦人的bug。

请参阅此博客文章: Windows Forms Designer for .NET Core Released

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

答案 17 :(得分:0)

如果您使用的是.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> li>
  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,但我不确定)并双击{{1 }},您应该看到以下内容:

Enter image description here

好的,打开工具箱( Ctrl + W X ),然后开始向您的应用程序添加控件并使它漂亮。

您可以在 Windows Forms .NET Core Designer 中了解有关设计师的更多信息。

答案 18 :(得分:0)

不断创新。
对于现有WinForms应用程序的特殊情况:

有一种方法-尽管我不知道它的效果如何。
像这样:
从mono获得WinForms实现。
将其移植到.NET Core或NetStandard。

根据新的System.Windows.Forms重新编译WinForms应用程序。
修复NetCore可能破坏的所有内容。
为单声道完美实现您所需的零件祈祷。
(如果没有,您总是可以停止祈祷,并向单项目发送带有修复/补丁/功能的拉动请求)

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