Mono是.NET的一个子集吗?

Ail*_*lyn 8 .net mono

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

Jör*_*tag 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#,...)

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


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

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