跨平台的.Net?

7
如果您想要编写一个运行在本地并调用Web服务的图形用户界面应用程序,并且希望它跨平台,您可以使用.Net吗?您建议使用哪些工具?
我考虑使用Java,因为它类似于C#,相对容易上手,而且我可以使用JVM。
9个回答

10

您应该熟悉Mono 项目MonoDevelop;这些项目的主要目的是允许在各种平台上构建和运行 .NET 代码,包括 Windows、Linux 和 Mac OSX。

由于 Mono 是 .NET 的重新实现,因此它总是稍微落后于 Microsoft.NET,但他们已经很好地覆盖了 .NET 2.0 和一些 .NET 3.x 特性。请注意,Mono 执行 .NET 二进制文件,因此只要您的程序功能受到 Mono 的支持,您就可以将在 Windows 上编译的应用程序 EXE 在 Linux/Mono 上运行而无需重新编译。


Mono在UI开发方面是否存在问题?你必须自己开发吗? - Dan
Mono支持Winforms和ASP.NET 2.0,并对3.x功能提供部分支持,因此您不需要自己开发。 - Jon Galloway
我所知道的关于在Mono上运行在Windows上编译的.Net代码的唯一注意事项是使用PInvoke(调用Win32 API),这在Linux或Mac上由Mono不完全支持,但对于调用Web服务的GUI应用程序来说,这不会成为问题 :o) - Andrew
运行Mono WinForms是一个糟糕的用户体验,因为它不使用本地小部件,而是“绘制”类似Windows的控件。要实现真正的跨平台GUI,您可以为每个平台开发GUI(Windows使用WinForms,Mac使用Cocoa#,Linux使用Gtk#/Qt#)。由于逻辑在WS中,因此应该这样做。 - Vincent Robert
您也可以使用 RemObjects C#。http://www.remobjects.com/elements/hydrogene/ - Gbolahan

7
另一个比较新的跨平台.NET开发选项是使用开源的Eto.Forms框架,它允许您拥有一个UI代码库,以便针对每个平台的本地工具包进行定位。
对于Windows,它使用WinForms或WPF;对于Linux,它使用GTK#;对于OS X,它使用MonoMac/Cocoa。
还有移动端口(iOS/Android)正在开发中。
请参考https://github.com/picoe/Eto

3

最好使用一些跨平台工具包来编写。很可能你将无法使用漂亮的可视化设计工具(取决于你选择哪种工具包),但是手写UI并不是非常困难。HTML开发人员一直在这样做,而且在非微软世界中也是相当普遍的做法。

一些带有.NET绑定的跨平台UI工具包

  • GTK#(Mono开发的事实标准,MonoDevelop IDE内置了利用此工具包的表单设计工具)
  • wxNET(基于wxWindows,非常成熟,但您需要手动构建UI)
  • Qyoto(基于QT,它可能比wxWindows更好,但如果您的应用程序不能具有开源许可证,则可能需要Trolltech的商业许可证)

为什么不使用Mono内置的Winforms?不使用Winforms会使部署更加复杂。 - Troels Arvin
因为WinForms的支持仅由Mono开发人员维护,正如您在他们的网站上所看到的那样,这仍然是他们的第二优先事项。第一优先事项是GTK#。GTK+、wxWindows和QT拥有比Mono上的WinForms更大更专注的团队,因此我不会押注WinForms在Mono上的支持能够持续很长时间。 - lubos hasko
事实上,Qt已经在LGPL下许可使用将近两年了,即使你的软件是专有的,也无需获得许可。此外,诺基亚现在运营Qt。 - Jim Brissom

3

一条建议。跨平台编程就像跨浏览器编程一样,唯一确定的事情是在您想要支持的所有平台上进行测试、测试和测试。


2

Mono是当前唯一的选择。它可以运行在这些平台上。但是仍然可能会出现问题,虽然不一定很严重。


Mono不是唯一的选择 - REALsoftware有一个名为REALbasic的产品,可以将同一项目编译为Windows、Mac和Linux的本机可执行文件: http://www.realsoftware.com/products/realbasic/ - Andrew
1
Mono实际上是唯一的严肃选择。REALBasic与.NET框架无关,而这个问题是关于跨平台.NET开发的。 - lubos hasko

0

0
如前所述,由于其社区支持,Mono项目是您最好的选择。
如果您使用Visual Basic,则REALbasic也值得一试,因为它具有创建本地可执行文件的交叉编译器。他们还提供了一个试用版,您也可以下载

0

我最近在Linux上编写了一个小的C# GUI应用程序,使用mono进行编译和运行。我发现我必须使用"gmcs"编译器才能访问现代C#和.Net功能(mono 1.9附带了几个不同的编译器)。

在编译.exe文件时,我发现我必须添加"-target:winexe"开关,以使应用程序在Windows上运行而不需要在应用程序后面弹出命令行。

我还没有找到如何编译一个在Windows上可以从网络驱动器运行而不需要在PC上进行特殊的.Net安全配置的.Net应用程序。(我认为这是.Net应用程序的一般问题,但我仍在学习中。)


-1
说实话,我会评估你的客户群和现有技能。如果你的Windows和非Windows的比例是50/50或者70/30,你可能最好使用Java或其他跨平台工具包。
Mono是一个不错的平台(参见这个SO问题大约一周前提出),但如果你要做任何重要的事情,我建议你选择专门为此设计的工具包。
顺便说一下,如果你想看看在Mono上.NET GUI应用程序的样子,这里是我发布的一篇文章,介绍了我如何在Mono上运行NUnit GUI:

http://www.cornetdesign.com/2006/07/nunit-gui-running-green-on-monolinux.html


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