Mono是.NET的一个子集吗?

时间:2010-08-15 13:58:57

标签: .net mono

我知道反过来是不正确的,但是如果我的应用程序使用Mono工作,那么如果我切换到真正的交易,它可以保证工作吗?如果没有,我在哪里可以找到一系列警告?

4 个答案:

答案 0 :(得分:18)

Mono和.NET都是ECMA / ISO CLI系列规范的超集。但是,.NET和Mono都不是另一个的子集。 Mono和.NET都在ECMA / ISO CLI之上添加了功能,但是当Mono实现.NET的许多新增功能时,.NET并没有实现任何Mono的添加。

以下是一些例子:

  • Mono有更大的数组。这实际上是 ECMA / ISO CLI规范的附加功能,但是可选的:规范说数组索引必须是32位或64位。 .NET选择了32位,但是Mono选择了64位,因为拥有100亿条目和更多条目的阵列在超级计算应用程序中非常普遍,其中Mono拥有相当强大的市场份额。因此,如果您的应用程序具有包含数十亿条目的数组,则它将在Mono上运行良好,但不能在.NET上运行。
  • Mono内置了VM的延续。这些对于游戏编程很重要。
  • Mono对数组上的并行操作提供本机SIMD支持,这些操作映射到本机CPU SIMD指令(MMX,SSE,VMX)。
  • Mono有一个编译器即服务,微软只是模糊地讨论了一些未指定的未来版本的.NET。
  • Mono有很多额外的库,特别是对Windows Forms以外的图形库的绑定(wx.NET,Gtk#,Cocoa#,...)

但是,请注意(除了数组),所有这些都可以通过命名空间清楚地区分,因为它们都不在SystemMicrosoft命名空间中。


编辑:实际上,大多数上述扩展都是明确设计的,也适用于.NET。例如,Mono.Simd也可以在.NET上运行,但是如果没有Mono VM所具有的运行时支持,它就会非常慢。 (基本上,所有的SIMD操作都是用C#实现的,但是Mono编译器会检测这些调用并用相应的汇编指令替换它们。这样,它们可以在.NET上运行,但是没有特殊处理,它们会慢得多。)另外,C#REPL目前正在Reflection.Emit之上重新实现(目前,它直接调用Mono编译器),因此它将来可以在.NET上运行。 Gtk#在Windows和.NET上运行良好。

只有Mono.Tasklet库无法在.NET上实现,因为它需要VM级别的连续支持。

答案 1 :(得分:3)

没有。 Mono包含几个备用UI框架(Gtk#,wxWindows for .NET等)。

但是,如果您只使用Microsoft定义的类,那么您应该没问题。

答案 2 :(得分:2)

Mono是CLI标准的实现,CLR也是如此。

它包含了许多您在.NET BCL中可以找到的库,但不包含任何特定于Windows的库(WMI是一个可以想到的整个域)。

只要您保留非特定于Windows的功能,您就可以了。

单声道团队创建了一个工具,用于检查您的代码是否适用于Mono迁移分析器单声道{ - 3}}。

至于在Microsoft编译器中使用单声道代码,只要你包含你正在使用的库并且没有在linux上执行任何pInvokes,你应该没问题。

答案 3 :(得分:2)

Mono不扩展BCL API,至少不在System命名空间中。因此,您可以确定只使用System命名空间中的类型的应用程序是可移植的,无需从Mono重新编译到.NET。当然,一旦你进入.NET世界,你就不会在Mono命名空间中找到任何东西。

来自Mono FAQ

  

您打算拥抱和扩展.NET吗?

     

拥有良好的技术是好的。   扩展技术不兼容   方式对用户不利,所以我们这样做   不打算制作不兼容的   对技术的改变。

     

如果您有创新的想法,并且想要   我们鼓励创建新课程   你让这些课程运作   在Mono和.NET中都很好。   今天Mono船上有很多   开发的额外库   要么是单声道的成员   社区或其他团体。 在某些方面   在这种情况下,我们找到了来自的位   微软不完整,但我们   避免破坏API,而是我们   公开缺少的功能   新程序集(参见Mono.Security)