成功运行一个程序需要三个要素相匹配:
- 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)。
file *.exe
将显示有关CPU指令集和文件类型的信息。如果它是一个同时使用本地Win32 API调用的CLI/CLR(".Net"/Mono)应用程序,您需要运行它或查找任何显示为本地x86+Win32的file *.dll
文件。 - sladen