寻求用户在MacOS和Linux上使用C#(mono)的经验

5

我有一个朋友曾是一位严肃的Linux开发者,但现在他在Windows上使用C#开发,并且非常喜欢它。我对C#很感兴趣,因为像Java一样,我应该能够在一个系统上编译并在任何地方运行。

如果您正在Windows上使用C#进行开发,则使用的是.NET。在Linux和MacOS上,您使用的是Mono。

其他人发布过Mono非常不错,不再是科学项目,并且大多数核心Microsoft功能都已存在。但这并没有真正回答我所提出的问题。我想知道:

  1. Mono在Linux / MacOS上的性能如何与Java相比?如果我想在三个平台上以相同的对象代码快速运行,最好选择什么?
  2. 是否可以轻松/可能/合理地使用makefiles使用Mono并在emacs中进行开发?
  3. 在MacOS和Linux中支持代码重构吗?还是我最好忍受所有的开发工作都在Windows中完成?
  4. Mono与Subversion和其他开源开发堆栈的协作效果如何?autoconf怎么样?或者这是完全不同的做事方式吗?

谢谢


你说应该能够在一个平台上编译,然后在任何地方运行。我的问题是为什么你这样认为。如果你编译成通用字节码,如何充分利用64位处理和X86扩展呢?另一方面,符合标准的C/C++和具有良好构建系统(如CMake)的库可以编译以从本机硅优化中受益。另一方面,如果你想要真正的可移植性和易用性而不必担心最佳性能,那么Python会更适合你。只是这么说。 - SpliFF
你需要哪种类型的快速?是桌面应用程序的快速/多用户3D游戏的快速?如果我想要快速且跨平台,我会选择C/C++。 - Woody
@SpliFF - 一个好的即时编译器能够利用所有必要的64位处理和X86扩展,但前提是它从一个像样的中间语言中获取。然而,我需要在多个位置的多种体系结构上为客户提供服务,这让我感到很烦恼,因为我必须为每个平台进行编译。这也增加了分发的难度。我喜欢Python,但对于我所做的任务(涉及2GB-4GB的元素相关性),它太慢了。 - vy32
2
@SpliFF - 在你看来,我的朋友。我编写了一些.NET库,我在Linux和OS X上都使用它们。它绝对比Python快,而且我甚至不需要重新编译就可以将其集成到新项目中。此外,我在Linux上使用了第三方的.NET代码,而我甚至没有源代码。原始开发人员可能从未想过它能在Linux上运行,更别提提供本地的Linux二进制文件了。.NET和Java也有它们的优点。 - Justin
1个回答

10

我已经在Linux上使用Mono大约三年,最近也开始在OS X上使用它。在Linux上有些东西相当复杂,但在OS X上只有一些简单的ASP.NET MVC2应用程序。

1)对我来说,Mono的性能从未是个问题。这并不是说性能不重要,只是Mono自身的性能从未成为问题。我所做的很多工作都基于Web,因此在Mono之前,I/O和数据库内存使用率就已经影响到我了。

历史上,Mono最大的缺陷是垃圾回收器(GC)。我会说Java在这方面调优得更好。最新版本的Mono在这方面取得了巨大进步,但我无法为您提供任何比较的硬数据。

我确信Mono有时会更快,Java有时会更快,但我会说Java总体上更快。

2)您可以使用makefiles进行Mono开发。Mono团队本身也这样做。您当然可以使用Emacs,而且它还有一个C#模式

我倾向于使用MonoDevelop和xbuild(类似于msbuild的Mono版本),而且没有在Emacs中进行C#编程的经验。MonoDevelop非常棒,因为它在所有平台上都是完全相同的。而且,虽然我很少再使用它了,但与Visual Studio和SharpDevelop的项目格式相同也是很好的。

3)MonoDevelop具有相当不错的代码重构支持。它在Windows、Linux和Mac上都一样。您不需要使用Windows进行开发(尽管您肯定可以这样做),但我认为使用像MonoDevelop这样的IDE会让您更加满意。一旦您习惯了智能感知等功能,就很难离开它了。但是,集成调试、能够深入到框架中、数据库集成、单元测试、SCM集成以及其他良好的工具支持都在同一个地方,这对我来说只是正确的选择。

4)Mono本身当然不关心版本控制。您的源文件只是文本,您可以使用任何方法来管理它们。

尽管如此,MonoDevelop IDE内置了非常好的Subversion支持。我广泛使用它,并且这也是我即使在Windows上仍然难以离开MonoDevelop的原因之一。最新版本的MonoDevelop(2.6 beta)还包括Git支持。

你没有提到单元测试,但是MonoDevelop还将NUnit支持构建到了IDE中。我在每个项目中都使用它,它表现优秀。MonoDevelop中的版本是2.4.8(如果我没记错的话),所以它不太符合当下的标准,但是它依然很好用。

总而言之,Mono与开源工具配合得十分良好。它一直对我来说都表现得非常出色。

当然,Autoconf自身被Mono项目使用,但作为Mono开发人员,我从未看到有需要使用它的情况。我努力只在我的项目中使用托管代码。因此,在目标平台上所需要的全部仅仅是Mono(或.NET)。不必担心所有这些东西对于像Mono或Java这样的托管环境而言是其中一个主要好处。运行时本身(CLR)确保我的应用程序具备了其正常运行所需的一切条件。

我知道MonoDevelop将构建autoconf/autorun文件用于C/C++项目(非Mono项目),但我自己并没有使用过它。

至于之前的评论,显然Mono JIT已经调整到了目标平台。这就是平台特定的性能调整所发生的地方。

仅仅作为一条评论,我认为最好将Mono视为一个独立的开发环境而非Microsoft兼容层。Mono团队以许多有趣的方式扩展了.NET。你为Mono开发的任何东西都将在.NET上运行,但是有一些.NET功能不适用于Mono。例如,Mono不支持Windows Presentation Foundation(WPF)。你必须使用Windows Forms或GTK#进行跨平台GUI工作。在Mac上,你也可以使用类似Cocoa#或MonoMac的东西,在iPhone上使用MonoTouch,在Android上使用MonoDroid。你也可以使用Moonlight代替Silverlight,尽管我还没有玩得很多。

既然您问到Java,还有一件事情要说。有几次我发现Java世界中有些库在.NET世界中找不到相应的等价物。在这些情况下,我使用IKVM.NET将它们集成到我的Mono应用程序中时非常幸运。IKVM.NET也适用于.NET,但Mono和IKVM.NET非常亲密,甚至共享一些代码。

所以,至少给您一个真实的答案。


这是一个真的很好的评论。非常感谢,这正是我在寻找的信息。 - vy32

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