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


101

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


您应该改变这个新平台的角度。WPF / WinForms / UWP / GTK#/ Xamarin.Mac / iOS / Android中的每个现有框架都可以使用您在.NET Core上编写的代码。这样就可以跨平台开发,而并非您想象的那样。
Lex Li

因此,您说我可以在-例如-winforms和.net核心中
构建

没有。可以将基于.NET Core构建的程序包直接添加为引用。
Lex Li

1
电子是必经之路。在api后面使用asp.net。如果保持ui逻辑不变,则应该能够将应用程序中最重要的部分保留在.net上
user7558114

1
作为提示,我将升级到Visual Studio 2017(如果可能)或使用其他可用工具(CLI和/或VS Code / Rider),因为VS 2015无法访问.NET Core 2.0工具,它将阻碍您的发展。即使您正在做的只是试验。
杰米·泰勒

Answers:


64

你什么都没错过。尽管UWP(通用Windows平台)部分构建在.Net Core之上,但MS一直没有提供直接使用.Net Core创建GUI应用程序的合理方法。

尽管仅Windows,.Net Core 3.0包括对Winforms和WPF的支持。

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

对于过去两年中出现的跨平台选项,请参阅其他答案。


41
天哪,这真是令人震惊!那么没有GUI的跨平台框架有什么意义呢?
EKanadily

19
@EssamGndelee重点是ASP.NET Core应用程序。第二点是控制台应用程序。
2016年

3
@ChristopherPainter .Net Core存在的部分原因是,是的。但这并不意味着微软现在只在乎那些。
svick

1
@CYoung我认为微软的立场是您应该为此使用UWP。
svick

1
@svick,它将完全消除任何.NET Core应该解决的跨平台编程。UWP仅对MS家庭足够好:/
walther

41

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


5
但是为什么要电子呢?您也可以只在端口X上打开一个Web应用程序,然后将浏览器导航到该端口。包含Electron可以提供的所有功能,以及更多功能,因为它始终是浏览器的最新版本-与Electron不同。如果您需要特定的浏览器版本,请在您的发行版中包含Google-Chrome。
Stefan Steiger

1
@StefanSteiger我认为使用电子并且直接通过程序集调用API将填补用户不会将其视为Web应用程序的空白。而且有些开发人员不想使用HTTP添加更多的通信层。
布赖恩·伍

Electron.Net看起来这是很简单的,现在cross-platform-b​​log.com/electron.net/...
J.阿伦

Electron.NET确实看起来很有希望,但是我会厌倦在生产中使用它,因为它会迫使您在生产计算机上打开一个不安全的Web服务器。再说一次,只要应用程序的ASP.NET Core端位于正确配置的反向代理服务器(如IIS或nginx(或类似))的后面,那么您应该更加安全。
杰米·泰勒

地狱可能只是将应用程序作为mvc / webapi,在随机端口上本地托管,并使用调用本地api的电子接口。
Wjdavis5

40

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

例如,使用Rider在MacO上进行开发:

  1. 按照说明安装Avalonia dotnet新模板
  2. 打开JetBrains Rider,然后在“欢迎”屏幕上,
  3. 选择New Solution->(在模板列表的顶部附近)-> More Templates->按钮Install Template...->浏览到在步骤1中克隆模板的目录
  4. 点击Reload按钮
  5. 看哪!Avalonia模板现在显示在New Solution模板列表中!
  6. 选择一个Avalonia模板
  7. 生成并运行。看到GUI打开在您的眼前。

GUI步骤将dotnet新模板安装到JetBrains Rider中


30

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

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

查看我的博客文章,以了解它与当前其他选项的比较。

PS:我是作者。


看起来很有希望,我会研究一下
Daniel

22

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

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

看看这篇文章,它解释了如何使用Electron和.Net Core构建跨平台的桌面应用程序,并github上检查代码


17

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

它包含以下组件:

  • 纽扣
  • 标签
  • 文字输入
  • 文字检视
  • 时间编辑栏
  • 单选按钮
  • 选框
  • 对话方块
    • 留言框
  • 视窗
  • 选单
  • 列表视图
  • 镜框
  • 进度条
  • 滚动视图和滚动条
  • 十六进制查看器/编辑器(HexView)

截图示例

gui.cs示例输出屏幕截图




4

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

我感觉希望将早期版本的.NET Core的跨平台GUI框架捆绑到官方工具中(尤其是该工具的旧版本-您提到您正在运行VS 2015 Update 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框架,您会发现它们有多沉重。

但是,隧道的尽头是光明的,因为Miguel de Icaza今年在.NET Conf上展示了Xamarin在Linux和MacOS上天真地运行(2017年,如果您将来会阅读的话),所以可能值得尝试准备好了

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


没有理由为Linux的多样性。1. Java平稳运行2. Mono正常运行WinForms(您很难看)在Linux中,您可以在基于QT的发行版上使用GTK,反之亦然。为.net核心提供QT绑定会很酷。
Bogdan Mart

我同意你所说的一切。但是,我认为Microsoft的方法是目前通过其Azure平台提供IaaS(基础设施即服务),SaaS(软件即服务)和PaaS(平台即服务)。他们的第一方,开源,跨平台框架会将开发人员作为优先方向指向这一方向,这是有道理的。Azure和RHEL和Google等其他公司在支持ASP NET Core和.NET Core方面所做的工作实际上都是传奇,而.NET Core的优先级似乎反映了这一点。
杰米·泰勒


3

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

它仍然是一个Web应用程序,但是它是一种轻量级的方法,可以在不学习新框架或不重新开发UI的情况下将其转换为桌面应用程序,并且效果很好。

不便之处例如不像电子ReactXP,其结果是通用Windows应用程序而不是跨平台桌面应用程序。


2

是的,有可能。

.NET Core没有现成的本机GUI应用程序任何组件。但是,根据Gregor Biswanger的回答,有一个NuGet软件包称为Electron.NET

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之上的任何知识。

该页面提供了有关如何使用它的教程。它还包含一些指向示例代码存储库的链接。


2

死灵法师。
对于现有WinForms应用程序的特殊情况:

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

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

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


2

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

这是怎么回事


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>
  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并添加以下预处理器-if
#if NETCOREAPP3_1
    Application.SetHighDpiMode(HighDpiMode.SystemAware);
#endif

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

在此处输入图片说明

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

您可以阅读有关designer @ Windows Forms .NET Core Designer的更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.