葡萄酒和单声道之间的区别


31

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

所以我想知道

  1. 他们之间的区别是什么?他们都是虚拟机吗?还是每个都属于其他类别?
  2. 最好何时将哪种用于哪种Windows应用程序?例如,那些可能需要或可能不需要.net Framework的应用程序。
  3. 他们彼此依赖吗?他们需要一起安装吗?还是每个人都独立工作而不存在另一个人?

谢谢并恭祝安康!

Answers:


34

成功运行程序需要满足以下三个条件:

  • CPU指令集(例如,PC中的x86,手机中的ARM,某些Apple Mac中的PowerPC,Java Applets的Java字节码,“。Net” / Mono应用程序的CLI
  • 二进制文件格式(例如,对于Microsoft Windows为PE / COFF “ .exe”,对于Java Applets为.jar,对于PE32 “ .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最初开发的几种独立技术的商标,但是对于用户来说,它们通常是作为一种下载的。

这同样适用于“净”,这是一种营销名优产品为几种不同的技术最初是由微软开发:在公共语言运行时/基类库(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是可以在Mac OSX,MS Windows和Linux上运行的Win32 API实现。
  • 您可以在任何操作系统之上的Wine之上运行Mono
  • 您可以在任何CPU体系结构的Qemu之上运行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下的Mono的Win32版本。如果CPU架构也相同,则需要进行仿真;因此Qemu下Wine下的Mono)。


22

简短的答案:

.NET是Microsoft对Java的回答,而Mono是Java的开源实现。Wine是用于本机exe的,与Mono没有任何关系,除了您可以像其他所有本机Windows软件一样使用它运行.NET运行时。


长答案:

要了解Wine与Mono(和.NET)之间的区别,您必须了解本机代码可执行文件与“公共语言运行时”(也称为“虚拟机”可执行文件)之间的区别:

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

“ CLR”或“ VM”可执行文件不是特定于一个处理器的:它们需要额外的软件才能使处理器运行它们。Mono / .NET就是这种系统的一个例子。.NET程序即使在Windows上运行也需要安装.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中为Windows安装Microsoft .NET运行时,然后通过它运行.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)应用程序,则需要运行它,或查找file *.dll显示为本机x86 + Win32的任何文件。
sladen

您也可以在Wine中为Windows安装Mono,但根据Wine FAQ,它比.NET运行时更不可能工作。没有简单的方法来知道.NET程序是否使用本机win32调用,因为它们可以通过多种方式来实现。最好的方法是先尝试Mono,如果它不起作用,请尝试Wine + .NET。
阿利斯泰尔·巴克斯顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.