一,mono 簡介
1.1 安裝地址
https://www.mono-project.com/download/stable/
1.2 使用
安裝完 mono 后,設定好環境變量就可以開心的玩耍 c# 了。
:上面的命令對於 mono 生成的 exe 可以在 MacOS,Linux,Windows 上運行。
:將一個 cs 文件打包成 exe(帶 Main 入口)或 dll
:可以像使用腳本一樣運行和測試 c#,其實在 unity 里面 c# 本質也就是一門腳本語言,因此 mono 這樣使用它一點不奇怪
:第二行有 node -e 那味了,但是 c# 的代碼從來都不是輕量級的,這模式其實不實用
:可將 exe 或 dll 反編譯成 il (intermediate language)中間語言 文件,這個就是實現跨平台的關鍵。
:生成帶簽名的庫。上述兩個命令只要保證 exe 里不帶 運行時 的代碼,就可以實現正逆向的轉換。
二,mono 原理簡述
il 是實現跨平台的關鍵,里面記錄的是堆棧等操作,那到了這一步再來個解釋器弄成平台無關的機器語言基本就是哪里都能運行了,畢竟只要是台電腦,硬件組成部分都是相通的。
mono 編譯出的 il 可以看作面向對象版本的匯編語言,里面包含很多豐富的信息,比如可以用來查看是否有拆裝箱的操作(unix):
其實實現相同功能的中間語言在動態語言中也存在,比如 javascript 中的 asm.js,可以看成腳本版本的匯編(C/C++翻譯成 asm.js 的前提下)。
谷歌就出了個 Emscripten 編譯器用來將 C/C++ 編譯成 asm.js。
如果理解了這些中間語言扮演的角色,其實就是告訴堆棧寄存器這些怎么去操作,那么當然每一門語言都可以寫出這樣的操作說明書,那不同語言之間當然可以寫一個編譯器將自己的這些操作翻譯成另一門語言去表述。