我知道反过来是不正确的,但是如果我的应用程序使用Mono工作,那么如果我切换到真正的交易,它可以保证工作吗?如果没有,我在哪里可以找到一系列警告?
答案 0 :(得分:18)
Mono和.NET都是ECMA / ISO CLI系列规范的超集。但是,.NET和Mono都不是另一个的子集。 Mono和.NET都在ECMA / ISO CLI之上添加了功能,但是当Mono实现.NET的许多新增功能时,.NET并没有实现任何Mono的添加。
以下是一些例子:
但是,请注意(除了数组),所有这些都可以通过命名空间清楚地区分,因为它们都不在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级别的连续支持。
答案 1 :(得分:3)
没有。 Mono包含几个备用UI框架(Gtk#,wxWindows for .NET等)。
但是,如果您只使用Microsoft定义的类,那么您应该没问题。
答案 2 :(得分:2)
它包含了许多您在.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)