在Windows上使用Mono有什么意义?

64

这也许是一个愚蠢的问题...但我刚刚了解了Mono项目,他们有一篇关于在Windows上安装Mono的文章。然而,由于Windows显然已经有.NET运行时,有人能告诉我为什么需要在Windows上安装Mono吗?它是否有助于跨平台开发或其他什么东西?

12个回答

67

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 等方面。


66

由于Mono没有像MS .Net Framework一样百分百实现.Net,因此在不运行Linux的情况下可以在Mono上进行测试是非常好的。此外,Mono具有与GTK绑定的功能,可以制作表单,而MS不支持。


我希望Miguel能够抓住机会去拥抱和扩展技术;但到目前为止,他只是在跟随微软的步伐。看到一个优秀的开发者被这样压制真是令人痛心。 - Javier
2
谁说他站在我们这边?咳嗽 - cgp
7
虽然 MS.Net 不支持 Gtk#,但 Mono 项目发布了一个安装程序,可以让 Gtk# 应用在不使用 Mono 的情况下在 MS.Net 上运行。 - jpobst
11
@Javier请阅读Miguel的这篇文章:http://tirania.org/blog/archive/2009/May-06.html。Mono绝对不仅仅是在模仿微软。 - Derek Ekins
2
Mono还有一些.NET没有的东西,比如已经提到的CsharpRepl(一个类似解释器的C#命令窗口,非常酷),TextTemplating引擎和Mono.Cecil,它比Reflection好得多-请参阅这篇不错的博客文章:http://amazedsaint.blogspot.com/2010/10/monocsharp-monocecil-and.html。 - Martin Salias

24

Mono具有一些.NET没有的功能。

例如,Mono支持静态链接,因此您可以构建、编译和分发应用程序而无需单独运行时安装程序。如果您构建了一个依赖于Mono的应用程序以实现跨平台,那么在Windows上坚持使用Mono会更大程度地保证兼容性。

.Net具有一些Mono没有的功能。

在BCL中有一些地方尚未为Mono移植,例如WPF和Winforms等。

如果您希望应用程序也能在Mac/Linux上运行,则可能首先要为Mono进行开发,即使您在Windows上完成了大部分工作。


注意:所有这些都是.NET Core/Standard之前的内容。


1
静态链接是我听说的Mono在Windows上被广泛使用的最重要的事情之一。 - Benjamin Autin

13

来自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运行时)。


12
如果您想在C#中开发跨平台应用程序,那么使用微软的实现不是最明智的选择,因为其他平台没有完全兼容的替代品。因此,在Windows上使用Mono开发应用程序可以确保您在将其移植到其他操作系统时几乎没有问题(前提是避免使用P / Invoke等其他陷阱)。

8

有些人使用Mono是因为他们的Windows PC不允许安装.Net框架,因为它会干扰注册表和系统文件(在受严格控制的环境下)。

而Mono则是自包含在Program Files中,并且只写入一个带有路径的注册表键(这并非运行所必需)。

我认为这有点傻,但这是多个用户告诉我们的事情。


4

这个工具主要是为了帮助开发人员在开发Mono特定库的应用程序时提供帮助。同时也有助于推动事业的进展,让开发人员在开发Mono应用时能够更加自然地操作。


1
什么是“自然环境”?Windows可能是你的自然环境。我有几个环境,它们都相当人工,但对我来说还不错。 :) - Martin Salias

3

虽然不是普遍感兴趣的,但在一些情况下,Mono比标准的Microsoft运行时有更好的性能。Migel在今年的PDC上就其中一些问题发表了演讲:

请参考以下文章:


2

即使您的程序与Mono动态链接,您也可以将已编译的.exe文件和Mono运行时放在U盘上,并转到另一台没有安装.NET/Mono的计算机上,在新电脑上运行该程序而无需进行任何运行时安装。这导致了便携式应用程序(作为便携式USB闪存驱动器应用程序特别有用)。 这在.NET中是不可能的。您必须以特定的安装程序方式安装.NET运行时,即不能通过复制和粘贴包含运行时的文件夹来实现。


1

我认为他们这样做的主要原因是可以在Mono和.NET并行运行.NET应用程序进行比较。此外,还有一些应用程序依赖于Mono库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接