我应该在一个真正的项目上使用Mono吗?
有没有人使用Mono,一个大型或中型项目的开源.NET实现? 我想知道它是否适合现实世界的生产环境。 它稳定,快速,兼容,…足够使用? 将项目移植到Mono运行时需要花费很多精力,还是真的兼容到只运行已经编写的Microsoft运行时代码?
我已经将它用于一些内部和商业项目,取得了巨大的成功。 我的警告:
- 写大量的unit testing,确保它们全部通过单声道 – 这将为您节省很多麻烦。
- 除非你绝对必须,否则不要使用他们的embeddedAPI。 这该死的使用起来很简单,但是不好的方法是垃圾收集有效的内存或泄漏你所有的内存。
- 永远,甚至永远不会接近SVN,除非没有select,不要编译自己的。 在SVN中事情经常发生变化,如果你的项目非常庞大,那么很有可能你会最终实现一些在发行版上无法运行的东西。
- 不要试图自己解决问题,使用IRC频道。 那里的人是有帮助的,你会为自己节省一天 – 不要犯同样的错误。
祝你好运!
编辑:我说不从源代码(发行版或SVN)编译自己的原因是,它很容易configuration它比释放二进制文件和隐藏错误,例如垃圾收集。
编辑2:忘记回答你的问题的第二部分。 在我的情况下,我没有移植代码的问题,但我没有使用任何特定于MS的库(WinForms,ASP.NET等)。 如果你只使用System。*的东西,你会没事的。 除此之外,你可能会遇到问题。 虽然单声道2.0是相当稳固的。
我发现Mono大多数与MS兼容。 因此,我只需使用MS进行编译,然后在任何地方运行,就像Java一样!
Mono在Linux上的performance与MS非常接近,在某些情况下慢了2倍,而在Windows上运行Mono时低了5-10倍(但是你应该坚持MS)。
我有一些Mono的经验。
纯.NET的东西(如业务逻辑,控制器或algorithm)可以移植没有任何问题。 然而,奇怪的事情开始出现在与操作系统,UI,服务或持久性交互的组件中。 所以准备一些debugging和黑客行为。
可能有帮助的事情:
- 组件驱动的开发 – 使代码被Windows .NET和Mono重用,而差异被隔离和testing)
- 持续集成在Mono和MS.NET上运行和检查所有内容,以便尽可能快地发现可能的问题(也推荐使用自动部署和完整性检查)
- Mono中没有太多的用于shell开发的UI组件套件。
- 当一个组件供应商说他的代码“与Mono兼容”时,它与“在Mono上运行并且被支持”不一样。
虽然目前有一些公司正在与Mono合作生产 ,但我还是要等到因为:
- 缺乏体面和商业支持的UI组件套件
- 高效的垃圾回收问题
- 不是最好的debugging体验(与VS 2010中的历史debugging器相比)
PS:如果有一家公司提供完全托pipe的云计算解决scheme(不只是一个虚拟机,而更像是Hadoop等同于.NET的),那么我将被迫跳入这个问题。
如果你正在做ASP.NET 2.0的工作,它工作得很好。 Winforms可能会工作,但它可能会导致显示问题。 如果你想在表单应用程序兼容,我会build议GTK#,因为它是跨平台。
就像build议的那样,只要你经过彻底的testing,我会同意在商业上使用它,如果这对你来说是一个可行的select,除非它是你需要的winforms。 在我看来,现在我会远离它。 而且忘记WPF,因为目前还没有支持,而且可能永远也不会(虽然他们正在为月光,也就是linux的silverlight)
我自己并没有使用Mono,但您可能有兴趣知道FogBugz使用Mono在Linux平台上提供Lucene.NET。 (我只知道这个,因为Joel在Stack Overflow Podcast#24中提到了它。)
我在生产中有一堆shell应用程序。
我同意@cody-brocious,写了很多unit testing。 我发现在过去,正则expression式不能像Windows CLR那样工作。
这实际上比你想的更简单,只是编译和运行。 如果您在项目中使用NAnt,则更易于转换。
我通常从源代码版本安装单声道,我没有任何问题。
我用它来encryption/解密工具,它工作正常。
在未来,我会考虑使用Mono / C#,但我不认为它完全像Windows上的.Net一样。
当然,你可以,尤其是在Mono 2.0发布之后。 单声道2.0,已经准备好了真正的项目。
你可以检查这个