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

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

所以我在想

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

感谢致敬!

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

  • 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字节码/ ThumbEE 。 某些操作系统本身也可以提供多个API(Microsoft Windows提供Win32POSIX )。

对于其他一切,您需要额外的软件。 对于运行Java程序,您需要上面列出的三个部分才能使其工作: 运行字节码的Java虚拟机程序; 一种启动Java程序的方法,以及一个用于程序调用的Java Classlibrary。 “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
  • 除了任何CPU架构之外,您还可以在Qemu之上运行Wine

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

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

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

简短的回答:

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


答案很长:

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

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

“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中的本机函数,那将会失败,win32 API是为Windows制作的许多(但不是全部).NET应用程序。

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

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