据我所知,Wine 和 Mono 都用于在 Ubuntu 下运行 Windows 应用程序。
所以我想知道
- 它们有什么区别?它们都是虚拟机吗?还是各自属于其他类别?
- 什么时候使用哪种方式对哪种 Windows 应用程序更好?例如,那些可能需要或不需要 .net Framework 的应用程序。
- 它们相互依赖吗?它们需要一起安装吗?还是每个都可以独立工作而不需要另一个的存在?
感谢致敬!
答案1
成功运行一个程序需要满足三个条件:
- CPU指令集(例如。x86在你的电脑中,手臂在你的手机中,高性能计算机在一些苹果 Mac 电脑中,Java 字节码对于 Java 小程序,命令行界面适用于“.Net”/Mono 应用程序)
- 二进制文件格式(例如。聚乙烯/聚乙烯醇对于 Microsoft Windows,则为“.exe”,。罐对于 Java 小程序,PE32“。EXE文件”,极低频在Unix / Linux上)
- 应用程序接口;(例如.POSIX在 Linux/Unix 上,可可对于 Mac OSX,的Win32在 Microsoft Windows 上,基类库适用于“.Net”/Mono 应用程序)。
您可以通过使用模拟器/解释器(用于其他 CPU 指令集)、额外的文件加载器(用于外部文件格式)以及提供更多 API 的附加编程库来增加匹配所有这三个的机会。
还要注意的是,有些处理器可以原生执行多个指令集;PC 通常有x86和amd64指令集;手臂处理器可以执行四个:ARM32/Thumb/Java 字节码/ThumbEE一些操作系统本身也可以提供多个 API(Microsoft Windows 提供的Win32和POSIX)。
对于其他所有事情,您都需要额外的软件。要运行 Java 程序,您需要上面列出的三个部分才能使其工作:Java 虚拟机程序跑步字节码;启动 Java 程序的方式,以及程序调用的 Java 类库。“Java”是 Sun 最初开发的几种独立技术的品牌名称,但对于用户来说,它们通常作为一个整体下载。
同样的情况也适用于“.Net”,它是微软最初开发的几种不同技术的营销品牌名称:公共语言运行时/基类库(CLR)是 API;血管紧张素转换酶是加载器,公共语言接口(CLI)是指令集。
您不必仅仅因为他们最初发明了某些技术就从 Microsoft、Sun 或 Intel 下载这些技术。AMD 生产的处理器与 Intel 的标准兼容;Apache(“Harmony”)和 Google(“Android Dalvik”)都制作了类似 Java 的套件;Mono 提供了 CLR/CLI/VES 套件。重要的是,每个人都使用相同的标准,从而使它们兼容。DVD 光盘可以在任何符合标准的 DVD 播放器上播放,HTML 网页可以在任何符合 HTML 标准的 Web 浏览器中呈现。
- 单核细胞增多症是一个可以在 Mac OSX、MS Windows 和 Linux 上运行的 CLR/CLI/VES 套件。
- 葡萄酒是一个可以在 Mac OSX、MS Windows 和 Linux 上运行的 Win32 API 实现。
- 你可以运行单核细胞增多症在之上葡萄酒,在任何操作系统之上。
- 你可以运行葡萄酒在之上库姆,位于任何 CPU 架构之上。
所以单核细胞增多症使 CLR .exe 应用程序运行,并且葡萄酒使 Win32 .exe 应用程序运行。唯一的共同点是文件名以“.exe”结尾;内容完全不同且不兼容,因此您需要正确的一。
就像 Python 解释器在使用 Perl 时会出错(反之亦然)一样,CLR 解释器在使用 x86+Win32 或 JVM+Java 字节码时也会出错。如果您可以发布您想要运行的特定程序的链接,我或其他人应该能够告诉您该程序的确切指令集、文件格式和 API,以及您需要在 Linux 上安装什么才能运行它。希望对您有所帮助!
(有时你甚至可能需要两者。例如,开放火车模拟器是 C# 语言,编译为 PE/COFF+CLI+CLR,但可以选择使用为 PE/COFF+Win32+x86 编译的 C 二进制插件。在这种情况下,您需要 Wine 下的 Win32 版本的 Mono。如果 CPU 架构也不同,则需要模拟;因此 Wine 下的 Mono 需要在 Qemu 下运行)。
答案2
简短的回答是:
.NET 是微软对 Java 的回应,而 Mono 是它的开源实现。Wine 适用于本机 exe,与 Mono 无关,只是您可以像任何其他本机 Windows 软件一样使用它来运行 .NET 运行时。
长答案:
要理解 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 应用程序都使用 win32 API 中的本机函数。
或者,您可以安装 Microsoft .NET 运行时对于窗户在 Wine 中,然后通过它运行 .NET 应用程序。在这种情况下,您根本不会使用 Mono。
3) Wine 和 Mono 完全不依赖彼此,但如上所述,您可以使用 Wine 中的 Microsoft .NET 运行时来运行 Mono/.NET 应用程序。