Mono是如何工作的

时间:2008-10-19 19:33:12

标签: c# mono

我在Visual Studio with .NET中使用过C#,我在openSUSE Linux上玩过Mono,但我真的不明白它是如何工作的。

如果我在.NET上使用Windows编写应用程序,这与Mono有什么关系?我不能在没有Wine的情况下在Linux上执行Windows .exe文件,因此它无法帮助我执行在Windows中开发的应用程序。

目的是纯粹在Linux(和其他)上使用.NET库等同于使跨平台开发更容易吗?例如,如果我是一家企业并且想要接触Linux客户,但是真的想使用.NET,那么Mono应该是我的选择吗?还是有更多我想念的东西?

8 个答案:

答案 0 :(得分:119)

答案 1 :(得分:22)

Windows EXE包含多个“部件”。 简化,.net代码(= MSIL)只是EXE的一部分,EXE中还有一个“真正的”原生Windows部分,作为.net的某种启动器。然后执行MSIL的框架。

Mono将只接受MSIL并执行它,忽略本机Windows Launcher的东西。

同样,这是一个简化的概述。

编辑:我担心我对深层细节的理解对于非常详细的细节来说还不够(我大致知道PE标题是什么,但不是真正的细节),但我发现这些链接有用:

NET Assembly Structure – Part II

.NET Foundations - .NET assembly structure

答案 2 :(得分:11)

事实上,您可以在Linux上使用Mono运行.NET .exe文件。这不需要Wine。事实上,Mono将程序编译为.exe文件,可以在Linux上运行Mono,也可以在Windows上运行。

答案 3 :(得分:3)

Mono是Microsofts .NET CLR(公共语言运行时)的开源实现。这是运行.NET程序的一部分,它不是本机代码,而是CIL(通用中间语言),一种语言和机器中立的中间语言。运行时获取该中间代码并将其转换为机器代码。

在Mono的当前状态下,您可以使用.NET的主要部分(mscorlib.dll)运行.NET程序,并在Mono运行的任何地方运行它们,而不仅仅是Windows。

答案 4 :(得分:2)

但是正如提到Mono是开源的,你不能仅仅依赖它将是完整的.NET实现,它有一些不起作用的控件,你必须小心P / Invokes你的应用程序将使用,例如您的应用程序将与win32下的MCI(多媒体控制器接口)通信。但我也使用单声道写GTK#应用程序,但我也使用了我的Windows应用程序,无需重新编译,如上面提到的我们的同事程序员,也就是说,mono是Microsoft的.NET的开源替代品,默认情况下,如果你正在构建WinForms或Gtk#应用程序mono将编译并将为每个文件创建一个.exe程序集,当然如果你想要它将创建一个动态链接库(DLL),几乎就像在.NET中一样。只是为了建议尝试编写一些Gtk#(使用MonoDevelop IDE,其内置的gui设计师称为stetic)。当然,mono可以很好地替代你可以在.NET上创建它们的Web服务,你可以在Apache上托管它们(因为现在Linux托管比Windows更便宜)web服务和其他asp.net应用程序可以在带有mod_mono模块的apache,必须包含在apache中。

有点偏离主题,但我只想告诉你我的经验。

答案 5 :(得分:1)

此外,您可以查看MoMA(如果您的目标是将应用程序从Win移植到Lin)。

  

单声道迁移分析仪(MoMA)   工具可帮助您识别可能出现的问题   移植你的.Net时有   应用于Mono。它有助于精确定位   特定于平台的调用(P / Invoke)和   尚未支持的区域   Mono项目。

MoMA

这是一个webapp,用于比较Mono和.NET Framework 3.5已经实现的BCL类型

http://mono.ximian.com/class-status/2.0-vs-3.5/index.html

答案 6 :(得分:0)

为了进一步迈克尔的回应,我相信你将不得不重新编译Mono,让应用程序在Mono运行时运行。可能存在例外情况。我只和Mono玩了一下,我总是重新编译源代码。我从未试图直接在Mono上运行.NET应用程序。

此外,Mono 1.9应该完全符合.NET 2.0标准。 Mono Olive和Moonlight应该添加.NET 3.0(更少的WPF)和Silverlight功能。

答案 7 :(得分:0)

它可能对您有帮助,How does Mono's C# compiler work?以及Understanding Mono C# Compiler预订。