我应该在真实项目中使用Mono吗?

时间:2008-10-08 07:39:08

标签: c# mono enterprise

有没有人使用过大型或中型项目的开源.NET实现Mono?我想知道它是否适合现实世界的生产环境。它是否稳定,快速,兼容,......足以使用?是否需要花费大量精力将项目移植到Mono运行时,或者它是否真的非常兼容,只需要为Microsoft的运行时获取并运行已编写的代码?

8 个答案:

答案 0 :(得分:31)

我已将它用于许多内部和商业项目并取得了巨大成功。我的警告:

  • 写下大量的单元测试并确保它们全部通过Mono - 这将为您省去很多麻烦。
  • 除非您必须这样做,否则请勿使用其嵌入API。它很容易使用,但它很容易垃圾收集有效的内存或泄漏你的所有内存。
  • 永远都不要接近SVN,除非别无选择,否则不要自己编译。 SVN中的情况经常发生变化,如果您的项目非常庞大,很可能最终会实现一些在发布版本上不起作用的东西。
  • 请勿尝试自行解决问题,请使用IRC频道。那里的人很有帮助,你会在几天内拯救自己 - 不要犯同样的错误。
祝你好运!

编辑:我说不从源代码(发布版或SVN版)编译自己的原因是它很容易配置它而不是发布二进制文件和隐藏错误,例如在垃圾收集中。

编辑2:忘记回答你问题的第二部分。在我的情况下,我没有移植代码的问题,但我没有使用任何特定于MS的库(WinForms,ASP.NET等)。如果你只使用System。*的东西,你会没事的;除此之外,你可能遇到问题。但是,Mono 2.0非常稳固。

答案 1 :(得分:5)

我发现Mono主要与MS二进制兼容。因此,我只是用MS编译,并在任何地方运行,就像Java一样!

Linux上Mono的性能与MS非常接近,在某些情况下慢了2倍,而在Windows上运行Mono则慢了5-10倍(但你应该坚持使用MS)。

答案 2 :(得分:5)

我有一些Mono的经验。

可以毫无问题地移植纯.NET内容(如业务逻辑,控制器或算法)。然而,奇怪的事情开始出现在与操作系统,UI,服务或持久性。所以要做好一些调试和黑客的准备。

可能会有所帮助的事情:

  • Component-Driven Development - 以便Windows .NET和Mono重用代码,同时隔离和测试差异)
  • Continuous Integration针对Mono和MS.NET运行并检查所有内容,以便尽可能快地发现可能的问题(建议自动部署和完整性检查)
  • Mono中没有很多用于shell开发的UI组件套件。
  • 当组件供应商说他的代码“与Mono兼容”时,它与“在Mono上运行并且受支持”不同。

虽然目前有一些companies going into production with Mono,但由于以下原因,我仍然会在此之前等待:

  • 缺乏体面和商业支持的UI组件套件
  • 有效垃圾收集的问题
  • 不是最佳的调试体验(与VS 2010中的历史调试器相比)
PS:如果有一家公司提供完全托管的云计算解决方案(不仅仅是一台虚拟机,更像是Hadoop相当于.NET),那么即使遇到这些问题,我也会被迫参与其中。

答案 3 :(得分:3)

如果您正在使用ASP.NET 2.0,它可以很好地工作。 Winforms可能会起作用,但它可能会导致显示问题。如果你想在表单应用程序中兼容,我建议使用GTK#,因为它是跨平台的。

如同建议的那样,只要你通过测试,我同意在商业上使用它,如果这对你来说是一个可行的选择,除非它是你需要的winforms。在我看来,我现在会远离它。忘记WPF,因为目前没有支持,可能永远不会(虽然他们正在开发月光,也就是linux的银光)

答案 4 :(得分:1)

我自己没有使用过Mono,但您可能有兴趣知道FogBugz使用Mono在Linux平台上提供Lucene.NET。 (我只知道这个,因为Joel在Stack Overflow Podcast#24中提到它。)

答案 5 :(得分:0)

我在生产中有一堆shell应用程序。

我同意@cody-brocious,写了很多单元测试。我在过去发现,正则表达式的工作方式与Windows CLR完全不同。

它实际上比你想象的更简单,只需编译和运行。如果您在项目中使用NAnt,则更容易转换。

我通常从源版本安装mono,我没有遇到任何问题。

答案 6 :(得分:0)

我已经将它用于加密/解密工具,并且工作正常。

将来我会考虑使用Mono / C#,但我不认为它会像Windows上的.Net一样完全

答案 7 :(得分:0)

当然,你可以,特别是在Mono 2.0发布之后。 Mono 2.0已经为实际项目做好了准备。

You can check this