有人在大型或中型项目中使用过。net开源实现Mono吗?我想知道它是否已经为现实世界的生产环境做好了准备。它是否稳定、快速、兼容……足够用了吗?将项目移植到Mono运行时是否需要花费大量的精力,或者它是否真的足够兼容,只需要为微软的运行时编写代码就可以了?
当前回答
在许多情况下,你可以获取现有的代码并在Mono上运行,特别是如果你正在移植一个ASP。网络应用程序。
在某些情况下,您可能需要全新的代码段才能使其工作。如果你使用System.Windows。例如,如果不修改表单,应用程序将无法工作。同样,如果您使用任何特定于windows的代码(例如,注册表访问代码)。但我认为最糟糕的是UI代码。这在麦金塔系统上尤其糟糕。
其他回答
在许多情况下,你可以获取现有的代码并在Mono上运行,特别是如果你正在移植一个ASP。网络应用程序。
在某些情况下,您可能需要全新的代码段才能使其工作。如果你使用System.Windows。例如,如果不修改表单,应用程序将无法工作。同样,如果您使用任何特定于windows的代码(例如,注册表访问代码)。但我认为最糟糕的是UI代码。这在麦金塔系统上尤其糟糕。
如果你想使用WPF,那你就不走运了,Mono目前还没有计划实现它。
http://www.mono-project.com/WPF
我们在一个需要在Linux上运行的项目中使用了它,但重用了我们在Managed c++中构建的一些。net库。我对它的成功感到非常惊讶。我们的主要可执行文件是用c#编写的,我们可以引用托管的c++二进制文件,没有问题。Windows和Linux之间c#代码的唯一区别是RS232串口代码。
我能想到的唯一大事件发生在大约一个月前。Linux版本有一个在Windows版本中看不到的内存泄漏。在做了一些手动调试之后(Linux上Mono的基本分析器没有多大帮助),我们能够将问题缩小到特定的代码块。我们最终修补了一个解决方案,但我仍然需要找一些时间回去,找出泄漏的根本原因是什么。
不幸的是,对于我们正在构建的应用程序类型来说,Mono似乎还没有准备好投入生产。总的来说,我们对它印象深刻,对它在Windows和EC2机器上的性能印象深刻,然而,我们的程序在Windows和linux上都因垃圾收集错误而崩溃。
错误信息是:“GC中的致命错误:太多堆节”,这里是一个链接,其他人以略微不同的方式遇到这个问题:
http://bugzilla.novell.com/show_bug.cgi?id=435906
我们在Mono中运行的第一段代码是我们开发的一个简单的编程挑战……代码将大约10mb的数据加载到一些数据结构(例如HashSets)中,然后对数据运行10个查询。我们将这些查询运行100次以计算它们的时间并获得平均值。
在Windows上,代码在第55个查询时崩溃。在linux上它可以工作,但一旦我们转移到更大的数据集,它也会崩溃。
这段代码非常简单,例如,把一些数据放入哈希集,然后查询这些哈希集等,所有本机c#,没有不安全的,没有API调用。在微软CLR上,它从来不会崩溃,在巨大的数据集上运行1000次也很好。
我们的一个人给米格尔发了邮件,附上了导致问题的代码,还没有回复。:(
似乎很多人也遇到过这个问题,但没有解决方案——有人建议用不同的GC设置重新编译Mono,但这似乎增加了崩溃的阈值。
在桌面端,如果您承诺使用gtk#, Mono工作得很好。窗户。表单实现仍然有一些bug(例如,TrayIcon的不能工作),但它已经取得了很大的进步。此外,gtk#是一个比Windows窗体更好的工具包。
在web端,Mono已经实现了足够多的ASP。NET可以完美地运行大多数网站。这里的困难是找到一个在apache上安装了mod_mono的主机,或者如果你有shell访问你的主机,你自己做。
不管怎样,Mono都很棒,而且很稳定。
创建跨平台程序时需要记住的关键事项:
使用gtk#而不是Windows。形式 确保文件名的大小写正确 使用路径。分隔符而不是硬编码“\”,也使用环境。换行,而不是“\n”。 不要使用任何P/Invoked调用Win32 API。 不要使用Windows注册表。
推荐文章
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 为什么Visual Studio 2015/2017/2019测试运行器没有发现我的xUnit v2测试
- AppSettings从.config文件中获取值
- 如何检查IEnumerable是否为空或空?
- 没有ListBox。SelectionMode="None",是否有其他方法禁用列表框中的选择?
- 在c#代码中设置WPF文本框的背景颜色
- 如何在iis7应用程序池中设置。net Framework 4.5版本
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何指定最小值,但没有使用范围数据注释属性的最大小数?
- 如何在PowerShell中获得本地主机名?
- 为什么在Java和。net中不能修改字符串?
- 'throw'和'throw new Exception()'的区别
- c# int到字节[]
- 如何跟踪log4net问题
- foreach vs somlist . foreach (){}