Wine、Nono - MAC下跑Window应用方法

AI 摘要: 本文介绍了在MAC上运行非跨平台应用程序的方法,主要讲解了基于Wine和Mono两种方案。其中,Wine是一个在POSIX-compliant操作系统上运行Windows应用的兼容层,而Mono是一个开源实现的软件平台,可以让开发人员轻松创建跨平台应用程序。对于在MAC上运行Window程序的需求,可以根据实际情况选择适合自己的解决方案。

背景问题

除虚拟机外,想在MAC下跑Window的Fiddler、PowerDesigner等优秀的非跨平台的应用方法。

1. 在MAC上基于wine跑Fiddler

Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,macOS 及 BSD 等)上运行 Windows 应用的兼容层。Wine 不是像虚拟机或者模拟器一样模仿内部的 Windows 逻辑,而是將 Windows API 调用翻译成为动态的 POSIX 调用,免除了性能和其他一些行为的内存占用,让你能够干净地集合 Windows 应用到你的桌面。

我本机MAC装有wine,在dbapp中看到还是黄金支持,通过winetricks安装了dotnet组件,折腾了一晚上,虽然wine启动后可以打开Fiddler软件,但很多功能使用还是很多问题:

2. 在MAC上基于mono跑Fiddler

Fiddler官方提供了一个MAC版本的支持,需要在mono框架下使用,那mono是什么?

3. Mono简介

Mono是一个软件平台,旨在让开发人员轻松创建跨平台应用程序。它是基于C#的ECMA标准和公共语言运行时的Microsoft .NET Framework的开源实现。

Mono于2004年7月30日发布了1.0版本,早期是想通过Mono项目创建一些工具让用户可以在更短时间内创建出更多的应用程序,后续Mono逐步从一开始的重点为Linux桌面应用程序开发者平台,到支持寛广范围的架构和操作系统。Mono现由Microsoft赞助,越来越多的解决方案系列以及积极热情的贡献社区正在帮助Mono成为跨平台应用程序开发的首选。

简单的说,开发人员通过C#开发了一个Window应用,通过微软.NET框架,仅能在Window环境下运行;但通过Mono开发多出来的软件,支持跨平台,可以在MAC或者LINUX环境下运行

4. Mono架构

Mono核心组件包含了C# 编译器,CLI(Common Language Infrastructure)虚拟机,以及核心类别程序库。

Mono程序的运行包含一个代码解释引擎,它会将ECMA CIL的byte code转译为原生码(Native Code),它支持了以下处理器:ARM, MIPS(只有32位模式), SPARC, PowerPC, S390(64位模式), x86, x86-64以及IA-64 64位模式。

程序的转译有三种模式:

  • Just-in-time (JIT)编译:在程序运行当中将ECMA CIL的byte code转译为原生码。
  • Ahead-of-Time (AOT)编译:ECMA CIL的byte code(通常在.exe档或.dll档中)会转译出原生码,并存储在操作系统中、以及CPU架构配置文件(例如在Linux上,如果是foo.exe,就会产生foo.exe.so档),降低了后续实时转译的开销
  • 完全静态编译:完全静态编译模式可以让程序的运行期完全不需要用到JIT

5. Dot NET框架

.NET框架(英语:.NET Framework)是2000年代由微软开发,一个致力于敏捷软件开发(agile software development)、快速应用开发(rapid application development)、平台无关性和网络透明化的软件框架。

2014年11月12日,微软宣布将完全开放.NET框架的源代码,并提供给Linux和macOS使用。

大多数Window环境的软件都是基于微软的.NET框架开发的,.NET框架是以一种采用系统虚拟机运行的编程平台,以通用语言运行时/平台(Common Language Runtime)为基础,支持多种语言(C#、F#、VB.NET、C++、Python等)的开发。

5.1. CLR 通用语言运行时/平台 - 字节码解释器

通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.NET的虚拟机所选用的名称。它是微软对通用语言架构(CLI)的实现版本,它定义了一个代码运行的环境。CLR运行一种称为通用中间语言的字节码,这个是微软的通用中间语言实现版本。

开发人员使用高级编程语言撰写程序。接下来编译器将代码编译成微软的中继语言(MSIL)。运行的时候CLR会将MSIL码转换为操作系统的原生码(Native code)。CLR内置有即时编译)编译器。

5.2. CLR对比下来就是JVM(JAVA虚拟机)

Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

java-overview:

jdk、jvm、jre:

6. wine、mono - 小结

在MAC上面跑Window程序,通过Wine或Mono这个方案之前,先考虑下是否符合自己的情况(可能有其他更佳方案):

  1. 是否有类似的MAC应用符合自己的工作情况,比如Window下的Powerdesigner、Fiddler很实用,在Mac下的Charles、Navacate SQL Model
  2. 基于完全虚拟机运行(比如VirtualBox、VMware、QEMU等)
  3. 做多个系统(比如双系统,比如同时安装Window和Linux,存在启动效率等方面问题)
  4. 上面提到的Wine或者Mono方案,性能开销比虚拟机小,但兼容性没有虚拟机那么好
  5. Docker容器也是一种软件解决方案

7. 参考

  1. https://www.winehq.org/
  2. https://zh.wikipedia.org/wiki/.NET框架#cite_note-4