葡萄酒和单一语言(Mono)之间的区别

据我所知,Wine和Mono都用于在Ubuntu下运行Windows应用程序。
因此,我想知道:
  1. 它们的区别是什么?它们都是虚拟机吗?还是每个属于其他类别?
  2. 对于哪些类型的Windows应用程序,使用哪种更好?例如,那些可能需要或不需要.net Framework的应用程序。
  3. 它们是否相互依赖?它们需要一起安装吗?还是每个都可以独立工作而不需要另一个存在?
谢谢和问候!
2个回答

成功运行一个程序需要三个要素相匹配:
- CPU指令集(例如,你的PC上的x86,你的手机上的ARM,一些苹果Mac上的PowerPC,Java Applets的Java字节码,".Net"/Mono应用程序的CLI) - 二进制文件格式(例如,Microsoft Windows的PE/COFF ".exe",Java Applets的.jar,Unix/Linux上的PE32 ".exe",ELF) - 应用程序编程接口(例如,Linux/Unix上的POSIX,Mac OSX上的Cocoa,Microsoft Windows上的Win32,".Net"/Mono应用程序的基类库)
通过拥有模拟器/解释器(用于其他CPU指令集),额外的文件加载器(用于外部文件格式)以及提供更多API的附加编程库,可以增加匹配所有三个要素的机会。
注意,一些处理器可以本地执行多个指令集;一个个人电脑通常具有x86和amd64指令集;ARM处理器可以执行四个指令集:ARM32/Thumb/Java字节码/ThumbEE。一些操作系统也可以本地提供多个API(Microsoft Windows提供Win32和POSIX)。
对于其他所有需求,您需要额外的软件。要运行Java程序,您需要上述三个部分才能使其正常工作:一个Java虚拟机程序来运行字节码;一种启动Java程序的方式,以及一个Java类库供程序调用。在这里,“Java”是Sun最初开发的几个独立技术的品牌名称,但对用户来说,它们通常作为一个整体下载。
同样适用于“.Net”,这是微软最初开发的几种不同技术的市场品牌名称:公共语言运行时/基础类库(CLR)是API;VES是加载器,公共语言接口(CLI)是指令集。
你不必因为它们最初发明了某些技术,就非得从微软、Sun或英特尔下载这些技术。AMD制造与英特尔标准兼容的处理器;Apache(“Harmony”)和Google(“Android Dalvik”)都提供类似Java的套件;而Mono则提供CLR/CLI/VES套件。重要的是每个人都使用相同的标准,使它们兼容。符合标准的DVD光盘可以在任何DVD播放机上播放,符合HTML标准的网页可以在任何支持HTML标准的浏览器中渲染。
  • Mono是一个可以在Mac OSX、MS Windows和Linux上运行的CLR/CLI/VES套件。
  • Wine是一个可以在Mac OSX、MS Windows和Linux上运行的Win32 API实现。
  • 你可以在任何操作系统上运行Mono,甚至可以在Wine之上运行。
  • 你可以在任何CPU架构之上运行Wine,甚至可以在Qemu之上运行。

所以Mono使CLR .exe应用程序运行,而Wine使Win32 .exe应用程序运行。唯一的共同点是文件名以".exe"结尾;内容完全不同且不兼容,因此你需要正确的那个。

就像Python解释器在面对Perl时会出错(反之亦然),CLR解释器在面对x86+Win32或JVM+Java字节码时也会出错。如果你能提供要运行的特定程序的链接,我或其他人应该可以告诉你它设计用于的确切指令集、文件格式和API,以及你需要在Linux上安装什么才能运行它。希望这有所帮助!

(有时你甚至可能两者都需要。例如,Openbve列车模拟器使用C#编写,并编译为PE/COFF+CLI+CLR,但可以选择使用针对PE/COFF+Win32+x86编译的C二进制插件。在这种情况下,你需要在Wine中使用Win32版本的Mono。如果CPU架构也不同,那就需要进行仿真;因此需要在Qemu中使用Wine下的Mono)。


简短回答:.NET是微软对Java的回应,而Mono是其开源实现。Wine用于运行本地exe文件,与Mono无关,只是你可以通过它来运行.NET运行时,就像运行其他本地Windows软件一样。
长答案:
要理解Wine和Mono(以及.NET)之间的区别,您必须了解本机机器代码可执行文件和“公共语言运行时”(也称为“虚拟机”)可执行文件之间的区别:
本机机器代码可执行文件使用特定于处理器的指令代码,并由处理器直接执行。这意味着它们必须针对不同的处理器重新编译。Wine能够通过直接运行此可执行代码并捕获其所做的任何库调用,将其重定向到自己实现的Win32 API来运行Windows的本机机器代码可执行文件。
“CLR”或“VM”可执行文件不特定于一个处理器:它们需要额外的软件来使处理器能够运行它们。Mono/.NET就是这种系统的一个例子。即使在Windows上运行.NET程序,也需要安装.NET运行时。Java也是同样的道理。
所以:
1)Wine和Mono之间的区别:Wine用于运行专为Windows制作的本机机器代码可执行文件,而Mono用于运行不一定为任何特定平台制作的Mono/.NET可执行文件。在Linux上安装Mono相当于在Windows上安装.NET运行时。
2)如果您想运行的程序根本不使用.NET,您必须使用Wine。在这种情况下,Mono对您没有任何帮助。

然而,如果程序使用 .NET,则您有两个选项,其中任何一个都可能起作用:

  • 你可以尝试使用 Mono 运行它。如果 .NET 程序还使用来自 win32 API 的本地函数(许多但并非所有为 Windows 制作的 .NET 应用程序都如此),则此方法将失败。

  • 或者,您可以在 Wine 中安装 Microsoft .NET 运行时 for windows,然后通过它运行 .NET 应用程序。在这种情况下,您不会使用 Mono。

3) Wine 和 Mono 完全不依赖彼此,但如上所述,您可以在 Wine 中使用 Microsoft .NET 运行时来运行 Mono/.NET 应用程序。


谢谢!(1) 所以,如果一个应用程序依赖于.NET和win32,唯一的方法就是在Wine上安装.NET,然后在Wine上安装该应用程序吗?(2) 如何知道一个应用程序是否依赖于.NET和/或win32? - Tim
1输入file *.exe将显示有关CPU指令集和文件类型的信息。如果它是一个同时使用本地Win32 API调用的CLI/CLR(".Net"/Mono)应用程序,您需要运行它或查找任何显示为本地x86+Win32的file *.dll文件。 - sladen
你也可以在Wine中安装Windows的Mono,但根据Wine FAQ所说,它的工作可能性比.NET运行时要低。没有简单的方法来确定一个.NET程序是否使用本地win32调用,因为它们可以以多种不同的方式进行。最好的做法是先尝试Mono,如果不起作用,再尝试Wine+.NET。 - Alistair Buxton