这也许是一个愚蠢的问题...但我刚刚了解了Mono项目,他们有一篇关于在Windows上安装Mono的文章。然而,由于Windows显然已经有.NET运行时,有人能告诉我为什么需要在Windows上安装Mono吗?它是否有助于跨平台开发或其他什么东西?
Mono有几个.NET没有的特性。
Mono高度模块化。您可以将其分解为微小的组件,仅部署您需要的那些部分。不想要 System.Xml 吗?那好,它被删除了。
Mono是可嵌入的。您可以在C/C++应用程序中托管它,以允许用户从安全的托管隔离环境中进行脚本编写。其中最著名的例子是 mod_mono,它将 Mono 托管在 Apache Web 服务器内,并且是 Mono 中实现 ASP.NET 的方式。此功能与上述可模块化功能非常搭配。
这已经被提到过:静态链接也与可模块化功能非常搭配。
编译器作为服务(Compiler as a Service)是另一个功能。Anders Hejlsberg 已经谈论它很长时间了,也许,只是也许,它会在 C# 5.0 就绪。好吧,Mono 已经拥有它并实际上已经有了多年的历史。
Mono 的首席开发人员 Miguel de Icaza 还有一个名为“Embrace and Extend.NET”的主动权,通过扩展 CLI 实现了其他 CLI 实现(包括 .NET)目前无法实现的方式。到目前为止,Embrace and Extend.NET 有三个功能。
Mono.Simd,它提供了对底层 CPU 的 SIMD 指令的安全和可控访问(例如 Intel 上的 SSE 或 PowerPC 上的 AltiVec)。用于游戏和图形。
64位数组索引是 ECMA 规范允许的,但 Mono 是唯一实际提供它们的虚拟机。用于超级计算。
最近的是 continuations。这实际上是 Mono 第一次走出规范的领域:长数组索引根据规范是完全有效的,Mono.Simd 也适用于符合 CLI 规范的所有实现(尽管非常慢),但 Mono.Tasklet 需要来自 VM 的特殊支持,而这不是 CLI 或 .NET 的一部分。它用于游戏逻辑和 Second Life 等方面。
由于Mono没有像MS .Net Framework一样百分百实现.Net,因此在不运行Linux的情况下可以在Mono上进行测试是非常好的。此外,Mono具有与GTK绑定的功能,可以制作表单,而MS不支持。
例如,Mono支持静态链接,因此您可以构建、编译和分发应用程序而无需单独运行时安装程序。如果您构建了一个依赖于Mono的应用程序以实现跨平台,那么在Windows上坚持使用Mono会更大程度地保证兼容性。
在BCL中有一些地方尚未为Mono移植,例如WPF和Winforms等。
如果您希望应用程序也能在Mac/Linux上运行,则可能首先要为Mono进行开发,即使您在Windows上完成了大部分工作。
注意:所有这些都是.NET Core/Standard之前的内容。
来自Mono的技术FAQ:
既然可以运行真实环境,为什么要支持Windows?
有各种各样的原因:
支持Windows有助于我们确定Mono的可移植部分和不可移植版本,帮助Mono在未来变得更加易于移植。
通过将问题分区(是运行时问题还是操作系统问题?),支持Windows使我们能够隔离Mono中的问题,从而帮助我们更好地解决问题。
约一半的Mono贡献者是Windows开发人员。他们有许多不同的贡献理由,我们认为让这些开发人员在Windows上运行运行时程序而不强制使用新的操作系统非常重要。
Mono不会大量修改Windows注册表、更新系统DLL或安装DLL到Windows/System32路径。
支持Windows的开发人员可以在将代码部署到Linux之前,在Mono下测试他们的代码。
Mono及嵌入Mono的应用程序可以在没有安装程序的情况下部署(您可以“xcopy”部署应用程序和所需的Mono文件,而无需安装.NET运行时)。
有些人使用Mono是因为他们的Windows PC不允许安装.Net框架,因为它会干扰注册表和系统文件(在受严格控制的环境下)。
而Mono则是自包含在Program Files中,并且只写入一个带有路径的注册表键(这并非运行所必需)。
我认为这有点傻,但这是多个用户告诉我们的事情。
这个工具主要是为了帮助开发人员在开发Mono特定库的应用程序时提供帮助。同时也有助于推动事业的进展,让开发人员在开发Mono应用时能够更加自然地操作。
即使您的程序与Mono动态链接,您也可以将已编译的.exe文件和Mono运行时放在U盘上,并转到另一台没有安装.NET/Mono的计算机上,在新电脑上运行该程序而无需进行任何运行时安装。这导致了便携式应用程序(作为便携式USB闪存驱动器应用程序特别有用)。 这在.NET中是不可能的。您必须以特定的安装程序方式安装.NET运行时,即不能通过复制和粘贴包含运行时的文件夹来实现。
我认为他们这样做的主要原因是可以在Mono和.NET并行运行.NET应用程序进行比较。此外,还有一些应用程序依赖于Mono库。