Windows 上 Mono 的意义何在
Posted
技术标签:
【中文标题】Windows 上 Mono 的意义何在【英文标题】:What's the point of Mono on Windows 【发布时间】:2010-10-19 14:16:53 【问题描述】:这可能是一个愚蠢的问题......但我只是在研究 Mono 项目,他们有一个关于安装 Mono on Windows 的部分。但是,既然 Windows 显然已经有了 .NET 运行时,谁能告诉我为 Windows 安装 Mono 到底有什么意义?它对跨平台开发有帮助吗?
【问题讨论】:
【参考方案1】:Mono 做了一些 .Net 不做的事情。
例如,mono 支持静态链接,因此您可以构建、编译和分发您的应用程序,而无需单独的运行时安装程序。如果您构建的应用程序依赖单声道来实现跨平台,则与 .Net 存在一些差异,因此在 Windows 上坚持使用单声道可以更好地保证兼容性。
.Net 做了一些 mono 不做的事情。
BCL 中有一些地方尚未移植到单声道,例如 WPF 和 Winforms 等。
如果您想要一个也可以在 mac/linux 上运行的应用程序,您可能希望首先为单声道开发,即使您在 Windows 上完成了大部分工作。
注意:所有这些都早于 .Net Core/Standard。
【讨论】:
静态链接是我听说 Windows 上的 Mono 被用于的最重要的事情之一。【参考方案2】:除了其他答案中提到的众多原因之外,可能需要在 Wine 上安装 Mono for Windows 才能在 Wine 中运行 .Net 应用程序。
【讨论】:
【参考方案3】:即使您有与 Mono 动态链接的程序,您也可以在 pendrive 上安装已编译的 .exe 和 Mono 运行时,然后转到另一台未安装 .NET/Mono 的计算机,然后在新 PC 上运行该程序而无需安装任何运行时.即,它导致便携式应用程序(特别适用于便携式 USB 笔式驱动器应用程序) 这在 .NET 中是不可能的。您必须以特定的安装方式安装 .NET 运行时,即无法复制和粘贴包含文件夹的运行时。
【讨论】:
【参考方案4】:来自 Mono 的technical FAQ:
既然可以运行真实的东西,为什么还要支持 Windows?
有多种原因:
支持 Windows 有助于我们识别 Mono 的可移植部分 从它的非便携版本, 帮助 Mono 在 未来。
它可以帮助我们,因为我们可以通过以下方式隔离 Mono 中的问题 划分问题(是 运行时问题,还是操作系统问题?)。
大约一半的 Mono 贡献者是 Windows 开发人员。他们有 许多不同的原因 为努力做出贡献,我们 发现让那些 开发人员在 Windows 上运行运行时 不强迫他们使用新的 操作系统。
Mono 不会大量修改 Windows 注册表,更新系统 DLL, 将 DLL 安装到 Windows/System32 小路。
它可以帮助基于 Windows 的开发人员在 Mono 在他们部署到 Linux 之前。
Mono 和嵌入 Mono 的应用程序无需 安装程序(您可以“xcopy”部署您的 应用程序和所需的 Mono 不安装 .NET 的文件 运行时)。
【讨论】:
【参考方案5】:我认为他们这样做的主要原因是他们可以在 Mono 和 .NET 上并排运行 .NET 应用程序来比较它们。此外,还有一些应用程序依赖于 Mono 库。
【讨论】:
【参考方案6】:Mono 有几个 .NET 没有的功能。
Mono 是高度模块化的。您可以将其拆分成很小的部分,然后仅部署完全您需要的那些部分。不想要 System.Xml?好了,没了。
单声道是可嵌入的。您可以将其托管在您的 C/C++ 应用程序中,以允许用户从安全的托管沙盒环境中编写脚本。最著名的例子是 mod_mono,它在 Apache 网络服务器中托管 Mono,例如,ASP.NET 是如何在 Mono 中实现的。此功能与上面提到的模块化相得益彰。
这已经提到过:静态链接。 也与模块化配合得很好。
编译器即服务是另一个。 Anders Hejlsberg 一直在谈论它很长时间,也许,也许它会为 C# 5.0 做好准备。嗯,Mono 已经拥有它,而且实际上已经拥有它多年了。
Mono 的首席开发人员 Miguel de Icaza 还提出了一项他称之为“拥抱和扩展.NET”的计划,该计划以其他 CLI 实现(包括 .NET)无法(目前)实现的方式扩展 CLI。到目前为止,Embrace 和 Extend.NET 具有三个特性。
Mono.Simd,它提供对底层 CPU 的 SIMD 指令的安全和受控访问(例如 Intel 上的 SSE 或 PowerPC 上的 AltiVec)。用于游戏和图形。
ECMA 规范允许的 64 位数组索引,但 Mono 是唯一真正提供它们的 VM。用于超级计算。
以及最近的延续。这实际上是 Mono 第一次偏离规范范围:长数组索引根据规范完全有效,而且 Mono.Simd 也适用于每个 CLI 兼容的实现(尽管 非常 SLOW) ,但 Mono.Tasklet 需要 VM 的特殊支持,该支持不属于 CLI 或 .NET。这用于游戏逻辑,例如在第二人生中。
【讨论】:
【参考方案7】:有些人使用它是因为他们不允许在他们的 Windows PC 上安装 .Net 框架,因为注册表和系统文件的数量太多了。 (在严格控制的环境中。)
另一方面,Mono 是自包含在 Program Files 中的,并且只写入一个带有路径的注册表项(这不是运行所必需的)。
我认为这有点傻,但这是多个用户告诉我们的。
【讨论】:
【参考方案8】:虽然没有引起广泛关注,但在少数情况下,mono 比标准 Microsoft 运行时有所改进。今年,米格尔在 PDC 上就其中一些内容发表了演讲:
查看这些帖子:
Video of the presentation SIMD support and gaming【讨论】:
【参考方案9】:Keeping You from Getting Tangled in a Net!
【讨论】:
奇怪的是没有人提到 mono 是开源的(它是,对吧?)。我相信这对某些人来说很重要。【参考方案10】:如果你想用 C# 开发一个跨平台的应用程序,那么使用微软的实现并不是最聪明的事情,因为其他平台没有完全兼容的替代方案。
因此,在 Windows 上使用 Mono 开发应用程序可以确保您将其移植到其他操作系统时不会遇到任何问题(前提是您避免了 P/Invoke 等其他坑)。
【讨论】:
【参考方案11】:它主要用于帮助为 Mono 特定库开发 Mono 应用程序。也是为了帮助推进这项事业,以便开发人员在为 Mono 开发时可以在他们的自然环境中工作。
【讨论】:
什么是“自然环境”? Windows 可能是您的自然环境。我有几个环境,它们都非常人工,但对我来说很好。 :)【参考方案12】:由于 Mono 没有 100% 地实现与 MS .Net 框架相同的 .Net,因此您可以在 Mono 上进行测试而无需在 Linux 上运行,这很好。此外,Mono 具有使用 GTK 制作表单的绑定,而 MS 不支持。
【讨论】:
我希望 Miguel 能够直截了当地接受和扩展;但到目前为止,他只是跟随 MS 的步伐。看到一个伟大的开发者被这样征服是很痛苦的 谁说他站在我们这边? 咳嗽 虽然 MS.Net 不支持 Gtk#,但 Mono 项目发布了一个适用于 Windows 的安装程序,允许 Gtk# 应用程序在没有 Mono 的情况下在 MS.Net 上运行。 @Javier 阅读了 Miguel tirania.org/blog/archive/2009/May-06.html 的这篇文章,mono 绝对不仅仅是关注 ms。 Mono 也有 .NET 没有的东西,比如已经提到的 CsharpRepl(一个非常酷的 C# 的类似解释器的命令窗口)、TextTemplating 引擎和比 Reflection 更好的 Mono.Cecil - 看到这篇不错的博文:amazedsaint.blogspot.com/2010/10/monocsharp-monocecil-and.html以上是关于Windows 上 Mono 的意义何在的主要内容,如果未能解决你的问题,请参考以下文章