Wine 和 Mono 的区别

Tim*_*Tim 35 mono wine

据我所知,Wine 和 Mono 都用于在 Ubuntu 下运行 Windows 应用程序。

所以我想知道

  1. 他们的区别是什么?它们都是虚拟机吗?或者每个都属于其他类别?
  2. 什么时候使用哪种 Windows 应用程序更好?例如,那些可能需要也可能不需要 .net Framework 的应用程序。
  3. 他们互相依赖吗?它们是否需要一起安装?或者每个人都独立工作而不存在另一个?

感谢致敬!

sla*_*den 37

成功运行一个程序需要三件事匹配:

  • CPU 指令集(例如,PC 中的x86、手机中的ARM、某些 Apple Mac 中的PowerPC、Java Applet 的Java 字节码、“.Net”/Mono 应用程序的CLI
  • 二进制文件格式(例如,用于 Microsoft Windows 的PE/COFF “.exe”、用于 Java Applet 的.jarPE32 “.exe”、Unix/Linux 上的ELF
  • 应用程序接口;(例如Linux/Unix 上的POSIX、Mac OSX上的Cocoa、Microsoft Windows 上的Win32、“.Net”/Mono 应用程序的基类库)。

您可以通过使用模拟器/解释器(用于其他 CPU 指令集)、使用额外的文件加载器(用于外部文件格式)以及使用提供更多 API 的附加编程库来增加匹配所有三个的机会。

另请注意,某些处理器可以本机执行多个指令集;PC 通常具有x86amd64指令集;一个ARM处理器可以执行四种:ARM32/Thumb/Java bytecode/ThumbEE。一些操作系统本身也可以提供多个 API(Microsoft Windows 提供Win32POSIX)。

对于其他一切,您需要额外的软件。要运行 Java 程序,您需要上面列出的三个部分才能使其工作:运行字节码的 Java 虚拟机程序;一种启动 Java 程序的方式,以及一个供程序调用的 Java 类库。“Java”是 Sun 最初开发的几种独立技术的品牌名称,但对于用户而言,它们通常作为一种技术下载。

这同样适用于“.Net”,它是 Microsoft 最初开发的几种不同技术的营销品牌名称:公共语言运行时/基类库(CLR) 是 API;VES是加载程序,通用语言接口(CLI) 是指令集。

您不必仅仅因为它们最初发明了某些东西就从 Microsoft、Sun 或 Intel 下载这些技术。AMD 使处理器与英特尔的标准兼容;Apache(“Harmony”)和 Google(“Android Dalvik”)都制作了一个类似 Java 的套件;Mono 提供了 CLR/CLI/VES 套件。重要的是每个人都使用相同的标准,使它们兼容。DVD 光盘将在任何符合标准的 DVD 播放器上播放,HTML 网页将在任何符合 HTML 标准的 Web 浏览器中呈现。

  • Mono是一个 CLR/CLI/VES 套件,可以在 Mac OSX、MS Windows 和 Linux 上运行。
  • Wine是一个 Win32 API 实现,可以在 Mac OSX、MS Windows 和 Linux 上运行。
  • 您可以在Wine之上运行Mono,在任何操作系统之上。
  • 您可以在Qemu之上,在任何 CPU 架构之上运行Wine

所以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 架构也不同,则需要模拟;所以在 Wine 下的 Mono 在 Qemu 下)。


Ali*_*ton 24

简短的回答:

.NET 是微软对 Java 的回答,Mono 是它的一个开源实现。Wine 适用于本机 exe,与 Mono 无关,只是您可以使用它运行 .NET 运行时,就像任何其他本机 Windows 软件一样。


长答案:

要了解 Wine 和 Mono(以及 .NET)之间的区别,您必须了解本地机器代码可执行文件和“公共语言运行时”(又名“虚拟机”)可执行文件之间的区别:

本机机器代码可执行文件使用特定于您的处理器的指令代码并由它直接执行。这意味着它们必须针对不同的处理器重新编译。Wine 能够通过直接运行此可执行代码并捕获它所做的任何库调用,将它们重定向到它自己的 Win32 API 实现,从而为 Windows 运行本机机器代码可执行文件。

“CLR”或“VM”可执行文件并非特定于一个处理器:它们需要一个额外的软件来使处理器能够运行它们。Mono/.NET 就是这种系统的一个例子。.NET 程序需要安装 .NET 运行时,即使您在 Windows 上运行它们也是如此。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 中安装适用于 Windows的 Microsoft .NET 运行时,然后通过它运行 .NET 应用程序。在这种情况下,您根本不会使用 Mono。

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