在跨平台项目中,C#和C++之间的区别

28

我的团队计划开发一个应用程序,最初面向Windows,但最终将部署到跨平台环境(Mac、Linux和可能的嵌入式设备)。我们需要决定是使用C#/.NET还是通用的C++(UI库采用Qt)。我们预计使用C#可以比C++更快地开发产品,并且成本更低,因为它具有比C++更高的生产力,但我们在赌注是否当我们要推出其他平台时,C#的跨平台实现是否足够成熟。

有没有在类似情况下的人给出任何建议?


2
它一定需要是一个臃肿的客户端应用程序吗?如果不是,Web应用程序可以提供跨平台兼容性,问题要少得多。 - Mark Maslar
1
它需要是一个智能客户端应用程序,因为在应用程序的使用情况下无法保证持续连接。 - Tony the Pony
3
注意:除非您正在处理简单的软件,否则这种所谓更好的C#生产力将很快消失。根据我的经验,Java或C#与现代C ++之间的生产力差异并不是天翻地覆的。 - rpg
18个回答

42

尽管 Mono 拥有潜在的跨平台功能,但现在来看,为了跨平台目的,C++/Qt 更成熟,比使用 C#/WinForms 或 C#/Gtk# 会更好。使用高级语言可能会带来一些生产力上的优势,但这很可能会被处理 Mono 的限制所抵消。


2
科技变化的速度真是惊人!事实上,在这个问题被提出和回答的三周前,微软发布了他们自己的独立 C# / .NET Framework 实现版本,适用于 Mac 和 Linux,并且带有一个 UI 组件,完全超越了 WinForms、Gtk# 和 Qt!不再需要担心 Mono 的限制:跨平台的 C# 交互应用程序现在已经成为现实,并得到了完整的供应商支持。 - Ray Burns
2
@Ray,什么?微软永远不会做那种事。 - CMircea
是的,他们会!而且他们确实做到了!提示:Beta版于2009年3月18日发布,最终版本于2009年7月9日发布。根据StatOwl的数据,截至2010年3月,已在47%的Web客户端上安装。无论是在Web浏览器还是独立运行时,在Windows、Mac或Linux上运行都很好。几乎和微软令人难以置信的WPF技术一样强大!过去六个月一直在软件开发新闻中出现。以“S”开头。(剧透警告)如果你还没有意识到我在说什么,这里是去年7月发布的实际Mac下载链接:http://go.microsoft.com/fwlink/?LinkId=107365 - Ray Burns
24
我猜你是指Silverlight。你原来的陈述在事实上是不正确的,因为微软从未发布过适用于Linux的Silverlight。Moonlight 不是微软的项目。 - Pavel Minaev

15

Jen,我对你的问题表述有所担忧。

“我的团队计划开发一个最初面向Windows的应用程序,并最终部署到跨平台(Mac、Linux和潜在的嵌入式设备)。”

计划是要做跨平台的吗?我可以推断出代码最初会为Windows编写,然后可能会花费精力修改项目以具备跨平台能力。这对你们的健康或者团队的健康都不好!在这里需要做出明确的商业决策。跨平台开发的黄金法则之一是要完全平等地处理所有目标平台。

C#是否可以用于嵌入式环境?它已经在商业上实现过了吗?只是好奇。

“我们预计通过使用C#,可以由于比C++更高的生产率,在更短的时间内以更低的成本开发我们的产品。” 你的意思是什么?你的预测基于哪些事实和数据?不要忘记,对于某些项目来说,编码工作量可能只占将产品推向市场所需总工作量的20%左右。因此,计算机语言的生产率比较可能并不那么重要。根据我的经验,按所谓的生产率标准选择计算机语言并不是很有效。

“我们正在冒险”我同意这一点,而冒险似乎与规划的含义相矛盾。问题是:有哪些风险?

你是否考虑过国际化?

是的,我批评了一些问题,但是那些为这个项目支付资金的人可能会更加挑剔。

书籍: Cross-Platform Development in C++: Building MAC OS X, Linux, and Windows Applications by Syd Logan - ISBN 032124642X 提供了解决问题的思路。

我曾经参与过一个跨平台和国际化的项目,使用了C++/Qt在Windows、Mac和Linux上进行开发,后来发现Qt解决了这两个问题。我对Qt不喜欢的一点是它不是现代的C++语言习惯,也不鼓励使用现代的C++语言习惯。就像MFC一样。


14

我使用C++/Qt开发跨平台软件已经多年了。
我强烈推荐这个解决方案给你的开发。
这样的解决方案可以在所有平台上提供性能!
此外,Qt不仅是一个GUI框架,还为您提供了完整的网络、数据库、I/O功能、出色的支持和非常巧妙的国际化系统!
最后,Qt在其支持的所有平台上提供本地外观。

关于性能方面,Mono/C#与C++/Qt相当吗?


12

再次提出一个需要回答“看情况”的问题!(取决于你的C#和C++程序员的技能水平,以及他们在C#中是否确实快得多等因素)。

只是一句话备注:
Mono项目提供了一个平台(版本2.0支持到.NET 3.0),可以在Mac或Linux系统上使用。其中包括微软代码糖LINQ。


3
从法律/专利的角度来看,Mono的现状如何? 假设情况是:微软开始看到Windows操作系统的流失,并发现Mono+Linux平台是主要因素之一。为了从其操作系统中挽回损失收入,微软要求商业软件供应商支付使用Mono平台所涉及的专利侵权费用。顺便说一下,这并不是那么假设——考虑一下vfat文件系统正在发生的事情。 - Richard Corden
它并没有真正谈论 .NET?它提到了 C# 和 C++/CLI 规范 - 但它们只是 .NET 的接口层 - 这并不说明底层的 .NET 基础设施。 - Richard Corden
@Richard: 我认为与许多其他开源(和一些闭源)项目相比,Mono处于更好的位置。您可以在此处找到更多信息: http://www.mono-project.com/Licensing#Patents 解决方案将类似于vfat的情况:稍微不同但无专利且兼容实现有问题的部分。 - Bad Sector
4
@Bad Sector:您提供的链接描述了绕过专利或者展示以前的技术来无效化该专利的方法。如果无法绕过该专利会发生什么?对于FOSS项目,这可能没问题,但如果您正在开发和销售商业软件,则可能会面临潜在的财务成本。VFAT专利有一种解决方法,但这并没有使TomTom免除向Microsoft支付使用费用。Mono有多少潜在专利?Microsoft可能会收取多少费用?谁知道呢?相比使用C++/QT,这是否值得冒险? - Richard Corden
2
当我看到一个主要的商业玩家使用C#时,我才会相信它是跨平台的。请注意,程序和mp3播放器不计入其中。 - rpg
1
@rpg Unity3D难道不是使用Mono+C#来制作基于浏览器的3D游戏吗(绝对不是笔记应用...)http://tirania.org/blog/archive/2008/Jun-05.html - Elazar Leibovich

8

我在很多跨平台项目中采取的方法是用一种非常便携的语言(C++)编写项目的“核心”,然后使用在各个平台上执行该任务效率高的语言来实现用户界面(以及其他任何与操作系统相关的内容,例如某些类型的数据访问)。

只想指出你不必只选择一种语言。


6
你是否坚持在所有平台上只使用单一的UI代码?我建议你考虑采用两个独立的UI,但是它们有一个共同的核心。对于本地UI来说,确实没有什么替代品。
在这种情况下,你可以使用Winforms / WPF(C#)作为Windows UI,使用Cocoa(ObjC)作为OS X UI,使用GTK(C#)作为Linux UI。所有这些都将使用一个通用的C#核心,能够在Mono和.NET上运行。Mono使得与ObjC相结合相对容易。

5
如果您想要跨平台,C++绝对是一种可行的选择。
编辑: 我认为您应该根据项目选择语言,而不是因为您习惯于某种语言而偏爱它。虽然C#可能提供跨平台支持,但它最初只设计用于Windows系统。
马克·马斯拉也有一个好点子,根据您想要开发的应用程序,基于Web的应用程序将完全独立于平台。

2
使用Mono,您可以在Windows、Mac和Linux机器上使用相同的代码。 - David Basarab
3
请删除“C#很难跨越到UNIX平台”的段落。这是错误的。 - Henrik P. Hessel
5
C#和.NET一般并不只是为Windows设计的。谁知道,在未来的10-20年里,C#和.NET的最佳实现可能会是Mono,并且即使在Windows上,所有人都将使用它。看看当Internet Explorer长时间没有更新、修复和创新时,Firefox如何获得动力,这就很清楚了。.NET框架在某些时候也可能会出现类似情况。 - lubos hasko
7
我认为.NET旨在仅在Windows上运行。微软对非Windows平台的支持相当有限,通常不鼓励人们运行其他操作系统(尽管他们喜欢Mac上的Office带来的收益)。 - David Thornley
@Jen:在我看来,最大的担忧并不是成熟度(法律和专利问题暂且搁置),而是Mono的可用性和在最终用户机器上安装的便利性。你不能指望用户去努力从源代码编译Mono - 如果你这样做,他们只会购买你的竞争对手的解决方案。 - NVRAM

4
如果你正在使用C++,并且GUI很重要,wxWidgets在所有平台上看起来都很“本地化”。值得一试。
如果你对C#很熟悉,我肯定会考虑它 - 提高生产力。

2
“看起来很自然”:Qt 也做得非常好! - Matthieu
我没有尝试过它 - 在QT更改其许可政策之前,我已经做出了我们的决定。 - Tim

4

可能涉及哪些嵌入式设备?如果它们无法与.NET或Mono配合使用,那么选择C#将会削弱这种可能性。(这不一定是操作系统问题;有些嵌入式设备具有严格的内存或性能限制,而.NET/Mono可能会超过这些限制。)

如果这不是关键问题,那么就有很多因素需要考虑。你的项目是否使用了标准的.NET功能,或者你是否可能会对Mono造成压力?你是否只熟悉C#而不是C++?(如果你比C#更擅长C ++,那么在一个项目上使用C#不太可能带来生产力上的好处,你应该选择C++并在其他不那么跨平台的项目上获得C#的经验。)在Windows上快速推出版本有多重要?(如果获取先发优势至关重要,或者如果你正在做一些不那么时间紧迫的事情,那么这可能是次要的。)你从Mac和Linux版本中会获得多少收益(通常比它们的市场份额所示的要多,因为竞争更少)?


3

你考虑过使用Python/C++/QT吗?

看一下这个。


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