有没有适用于C#/.NET的跨平台GUI框架?

19

假设纯粹为了兴趣,我决定不再使用Java编写桌面应用程序,而是想转而使用C#。 我希望能够构建一个可以在某些主流Linux发行版和最近的MS Windows版本上运行的应用程序,并且它将具有GUI组件。

在Java中,我可以构建使用Swing的应用程序。 一旦我让它工作,我可以将该jar文件从Windows复制到Linux或反之亦然,这取决于我开发它的地方。 并且通常可以通过"java -jar myapp.jar" 运行。

在C#中是否可能做到这一点? 在C#中是否存在与Swing或AWT功能相当的东西?

11个回答

23

有一个叫做Eto.Forms的抽象层(在github上),它是建立在WPFWinFormsGTKMonoMac/Cocoa之上的,所以你可以在所有平台上获得原生UI而无需为每个平台重新实现。你不必忍受最低公共分母,因为你可以针对每个平台实现具体特定的功能(如果需要的话)。

它的优点在于它是纯.NET,并且仅依赖于操作系统提供的依赖项,而不是使用GTK或WxWidgets,在这些情况下,你必须打包各种平台的本机二进制文件。


1
你好!我能在Windows上使用Eto.Forms和Gtk#吗?谢谢! - konstantin_doncov
@user2656632,当然可以。只需将适当的平台传递给Eto.Forms.Application构造函数即可。(; - Curtis

14

可能GTK#是最相似的。

我知道其他人说过mono,但那不太对。 .Net就像微软的Java虚拟机一样,而mono与Swing不在同一个概念空间内。因此,GTK#更接近。


2
我知道你的意思,在他的问题中,他询问了关于AWT或Swing的问题,但我认为他真正想问的是“我如何编写跨平台的C#应用程序?” - Sam Schutte
这已经很老了。基于XAML的东西更可靠。 - Joel Coehoorn

6

这个页面列出了Mono支持的GUI工具包清单,其中包括每个工具包的优缺点。正如其他人所建议的那样,WinForms、GTK#和wxNet都是可行的选择。


5
这些选择现在有很多。取决于您想要什么。 这里 是关于这三种技术的详细介绍。它们不是唯一的技术,但它们现在引起了最大的关注。 Xamarin Forms 基于C#和XAML,由Microsoft拥有的开源项目,支持Android、iOS、UWP等平台,本地渲染。 Uno Platform 基于C#和XAML,开源项目,支持Android、iOS、UWP等平台,本地渲染。 Avalonia 基于C#和XAML,开源项目,支持Linux、MacOS、Windows等平台,每个平台都可以实现完美的像素渲染。

重要新闻:截至2022年4月,您还可以开始使用Microsoft的下一代多平台GUI SDK(也是免费且开源的),称为.NET MAUI。这是对那些来自Xamarin的人的下一个进化步骤。看到“竞争”会推出什么以对抗微软应该很有趣。 - Gwyneth Llewelyn
1
@GwynethLlewelyn '竞争' Google已经推出了Flutter,它已经稳定支持所有底层平台。希望.NET MAUI不会成为另一个来自MS的糟糕UI框架。 - demberto
@demberto 你说得对——楼主应该将 https://developers.google.com/learn/topics/flutter 添加到“当今最热门技术”的官方链接中。我从未使用过Flutter,但它似乎至少保留了所谓的“本地”UI元素,而不像某些工具包那样覆盖一切。 - Gwyneth Llewelyn
@GwynethLlewelyn 原生UI现在是一堆垃圾。每个该死的公司都试图从彼此那里窃取外观和感觉。如果做得好,自定义UI可以为应用程序提供专业外观和独特品牌。 - demberto

5

我相信WinForms的很大一部分是在Mono中实现的。你需要在Linux下安装Mono。但是可能会有兼容性问题,因为Mono不是微软的努力,并且不受官方支持。


3
是的,但这是一个非常好的社区努力,并且我只在做一些非常荒谬的事情时看到过兼容性问题(注释太短无法描述:D)。通常正常的桌面编程都没有问题。 - Lucas Jones
2
据我所知,WinForms 2.0 的所有功能都已经实现。 - Gary Willoughby
1
@Jay:关键词是“几年前”,但Mono仍然是一个非常活跃的项目。 - Joel Coehoorn
使用WinForms作为跨平台UI可能是最糟糕的选择之一。它只在Windows上运行良好,但在Linux和OS X上看起来和工作都非常糟糕,没有人会喜欢在这两个平台上使用您的应用程序。使用像Eto.Forms(请参见我的答案)这样的UI抽象来获取本机UI,甚至使用GTK都是更好的选择。 - Curtis
@Curtis,这是一个四年前的答案,在当时做这件事并不是一件糟糕的事情。今天可能有更好的选择,但请记住问题/答案的时间。 - Rob
显示剩余4条评论

5

微软最近推出了.NET MAUI,它基于 Xamarin 并支持 .NET Core。

他们的说法是:

考虑到在一个统一的 .NET 中构建设备应用程序的模样,我们看到许多不同平台的设备被使用,包括 Android、iOS、Windows 和 macOS。为了满足这个需求,我们很高兴地宣布一个全新的第一类 UI 框架:.NET Multi-platform App UI,亲切地称为 .NET MAUI。

.NET MAUI 简化了 .NET 开发人员的选择,提供了一个支持所有现代工作负载的单一堆栈:Android、iOS、macOS 和 Windows。

尽管他们没有明确指定 Linux,但根据MAUI Github Repo 的介绍,社区已经开发了对它的支持。


4
微软最近宣布了.NET MAUI,更准确地说是“宣布”而不是“发布”。它的正式版本预计要到2021年11月才发布:https://github.com/dotnet/maui/wiki/Roadmap - Karl von L

4

到了2022年,.NET Core可以在任何你喜欢的操作系统和任何CPU上本地运行,而Roslyn编译速度惊人地快。好吧,几乎是这样。我们可以说99.9%的系统都得到了支持。本地支持。没有仿真,没有Mono子系统,没有Wine,什么都没有。你可以获得CLI应用程序,它们看起来和感觉与使用GCC编译的任何其他Unix应用程序完全相同。唯一的遗憾是——没有GUI(至少目前还没有),我们将不得不使用.NET MAUI(刚刚发布)或其他答案中提到的任何替代品。 - Gwyneth Llewelyn

2
对于iOS、Android和Windows Mobile,有Xamarin.Forms。http://xamarin.com/forms 这是一个抽象层,允许您编写跨平台代码,并在底层绑定本地GUI工具包。
我正在寻找更多类似的解决方案-我不仅关心移动平台,还关心桌面平台(Windows,Mac OSX,Fedora / Ubuntu /等Linux)。

2
您可以尝试使用WxWidgets。它支持多种语言,包括C#,并且是跨平台的。唯一的缺点是需要为每个平台重新编译。或者您可以尝试Mono,它非常好用,但要注意兼容性问题。目前还没有像Java中的jar文件那样预定义的C#应用程序“运行在任何地方”的文件,如果想确保兼容性,最好的方法是为每个平台重新编译。

2

我见过的最接近的东西是Mono - 尽管它还不支持所有CLR库,但它是跨平台的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接