.NET或Mono vs Qt,哪一个适合跨平台开发?

19

好的,这是一个险地,但试图理解为什么在跨平台开发中选择.NET(或等效的Mono),如果没有使用过两者,是很困难的。

对于可能已经使用过两者的程序员来说,会想念或需要哪些功能?相反,一个使用其中一种工具包的用户会发现另一种工具包缺少哪些范例或其他方面的东西?有很多值得说的话,但使用过两者的人的评论将是有价值的。

以下是一些相关问题:

编辑:如果Windows是目标平台之一,那么仅使用Mono是否是可行的选择?


关于你最后的问题,是的,如果你决定这么做,你可以简单地针对Mono进行目标设置,但这需要用户安装Mono,而.NET Framework则预装在较新版本的Windows上。 - Sasha Chedygov
7个回答

9
你会选择Mono(或许还有C#)进行跨平台开发,原因与选择Java或Python相同。这些语言运行在虚拟机上,如果你仔细选择库并设计代码,它将可以在不重新编译的情况下跨平台运行。本地语言(如C、C++)确实有标准,因此语言在多个平台上是相同的,但你使用的编译器设置和库可能不是跨平台的(例如进程、网络等)。
除了技术问题之外,跨平台框架的熟悉度也能节省时间。例如,学习GUI库可能需要几周甚至几个月的时间。如果API在所有目标平台上都相同,那么显然可以节省时间。
Qt4设计良好,文档齐全,并配备一些有用的、可靠的工具。wxWidgets正在变得庞大,拥有数十个小部件,其中一些可能永远不会被使用。Qt具有更少但更灵活的小部件。我曾经经常使用wx,但现在我是Qt的拥趸,因为它采用LGPL许可证,有良好的文档、设计师、PyQt、新的IDE和不断增长的用户群体。
Qt和wxWidgets都有Python绑定(即PyQt和wxPython),因此你可以使用这些库编写跨平台GUI代码。对于Mono来说,这更加棘手,但有GTK#和Qyoto。我没有尝试过它们,但它们似乎已经成熟到可以使用的程度了(例如,见MonoDevelop)。

1
Qt有比我想要列举的更多语言的绑定。 - jrharshath
已经过了一段时间,但这个答案似乎是最有信息量的。 - casualcoder
我可以使用Qt社区版创建商业目的的专有应用程序吗? - Saurin Dashadia

5

对于跨平台(和独特的平台)开发,我会选择Qt,因为它比Mono和Windows.Forms更简洁,并且采用MVC模式,使整个应用程序更易于扩展和修改。


赞同!欢迎提供任何差异的详细信息或扩展。 - casualcoder
2
Qt不像.NET一样倾向于单一平台,后者包含许多混乱的Windows特定库。 - Will03uk

4
我正在使用Qt4进行跨平台开发,非常喜欢它。部署很顺利(至少如果您静态链接Qt,这并不难),API非常好且一致,Qt Designer允许快速开发GUI部分,以便我们可以专注于真正的逻辑。一旦习惯了,我也非常喜欢信号和槽的概念。
根据我的经验,在wxWidgets上部署更加困难(在我的情况下,特别是Linux由于依赖GTK,对Mac无影响)。

1
也许你可以使用一种可移植的语言/框架编写大部分应用程序,并为计划支持的每个操作系统编写单独的“图形界面皮肤”?当然,这种策略在某些情况下可能效果很好,但在许多其他情况下可能会失败得很惨。

3
在Qt的情况下,甚至可以将“皮肤”与应用程序一起编写。该框架确保了“皮肤”具有本地的外观和感觉。 - jrharshath

1

这里有另一个选项,你没有提到,我也没有注意到在这里提到,但Lazarus是跨平台的,并且随着它的发展越来越成熟。当然,像用Qt编写的东西一样,您需要为特定的平台编译它。在我的情况下,我已经成功地在Mac OSX、Linux和Windows上运行了Lazarus项目。Lazarus是一个很好的RAD工具,Object Pascal对我写的大多数东西都很有效。Lazarus是应用程序速度的一个不错的选择。它与用c/c++编写的软件相比较得很好。我不打算证明这一点,因为有案例研究,如果你有需要,你可以自己进行测试。

我使用MonoDevelop编写c#代码的印象是,在库方面,特别是html和音频方面有些挑战。我只是玩了几个月的c#/MonoDevelop,所以我还很新手。我猜想,由于它是托管代码,所以可能要付出一些速度代价。同样,我认为研究表明,仅编译的代码往往比c#/.NET代码更具有速度优势。

当然,另一个选择就是Java。我在那方面的经验不多,但它肯定是无处不在的,并且运行良好。但我希望Java代码比编译后的代码(如c/c ++ / Pascal)要慢。

另一个我想到的选择是具有三个主要平台的编译器的Eiffel。虽然我现在没有用它做太多的事情,但我喜欢玩它。你的经验可能会有所不同。


0
你考虑过使用wxWidgets吗?它也是跨平台的,和QT一样是C++编写的,与QT不同的是它使用本地控件,并且无需像.NET那样运行任何框架。
.NET和mono几乎是相同的东西。如果您编写的是简单的用户应用程序,没有太多的系统或网络编程,那么.NET应该是最好的选择。
如果性能是应用程序的关键方面,很多人会使用像QT、wxWidgets这样的C++库。

这个回答对你有帮助吗:https://dev59.com/eXRB5IYBdhLWcg3w7riV#464689 - casualcoder
我该如何在商业应用程序中使用LGPL QT???我只选择了wxWidgets,经过长时间的研究。它快速,本地控件,C ++,多平台。https://dev59.com/eXRB5IYBdhLWcg3w7riV#465803 - Priyank Bolia
将LGPL Qt库动态链接。这符合LGPL的要求。当然,为了使用另一个库而重写现有代码库可能并不值得。但有时这是值得的。 - casualcoder

-2

.NET 不适用于跨平台。编写代码并使其在 MONO 和 .NET 上有效运行非常痛苦。个人选择 .NET 而不是 TCL/Tk、Qt 或 Java Swing 的原因是因为它具有快速应用程序开发功能。

使用其他框架几乎不可能进行快速应用程序开发。简单情况下可以进行快速应用程序开发,但您上次编写的基于业务的应用程序是否只有简单用例呢?

通常难以使用 GUI 工具包,因为您需要了解基础知识。这些基础知识包括数据绑定、剪辑、刷新、布局管理器和事件处理。所有这些概念对于普通开发人员来说都很困难。原因是现代工具包中的大部分内容都被抽象化了。例如,使用 Java Swing 时,我不需要了解任何关于剪辑或刷新的知识,因为它们会自动“神奇”地完成。但是,如果某些情况下无法自动刷新,那么这种情况就会变得几乎无法解决。代码也会变得更加复杂。

许多 UI 开发人员通常使用 .NET,因为扩展它非常简单。创建扩展控件的扩展方法非常容易。使用 .NET 实体框架创建绑定数据的方法甚至变得更加简单。但是,使用这种 RAD 工具需要付出代价,即它不是平台无关的。


请详细说明“痛苦”是什么意思? - EricSchaefer
@EricSchaefer:我怀疑.NET和Mono之间的差异导致了这个问题。 - casualcoder
1
我不知道,这是有争议的。Qt真的非常牛逼。 - mxcl
@EricSchaefer 我应该强调.NET和MONO之间的“和”这个词。你不会想在Windows机器上重新分发MONO库,这没有意义。 - jwendl
3
同意,QT IMO就像.NET一样接近RAD(快速应用程序开发),实际上是真正的跨平台,并且是本地化的,没有依赖于自身之外的任何东西,如果需要可以进行静态链接。 - ApplePieIsGood
4
为什么使用Qt进行RAD(快速应用程序开发)几乎是不可能的?它有一个设计师,并且使用PyQt可以快速创建原型。 - Nick

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