mono的使用


一,mono 简介

1.1 安装地址

  https://www.mono-project.com/download/stable/

 

1.2 使用

安装完 mono 后,设定好环境变量就可以开心的玩耍 c# 了。

mono 1.exe

:上面的命令对于 mono 生成的 exe 可以在 MacOS,Linux,Windows 上运行。

mcs 1.cs

:将一个 cs 文件打包成 exe(带 Main 入口)或 dll

csharp 1.cs
csharp -e  'new System.Net.WebClient ().DownloadString ("https://www.nuget.org")'

:可以像使用脚本一样运行和测试 c#,其实在 unity 里面  c# 本质也就是一门脚本语言,因此 mono 这样使用它一点不奇怪

:第二行有 node -e 那味了,但是 c# 的代码从来都不是轻量级的,这模式其实不实用

ikdasm 1.exe > 1.il

:可将 exe 或 dll 反编译成 il (intermediate language)中间语言 文件,这个就是实现跨平台的关键。

sn -k 1.snk
ilasm 1.il /key=1.snk

:生成带签名的库。上述两个命令只要保证 exe 里不带 运行时 的代码,就可以实现正逆向的转换。

 

二,mono 原理简述

il 是实现跨平台的关键,里面记录的是堆栈等操作,那到了这一步再来个解释器弄成平台无关的机器语言基本就是哪里都能运行了,毕竟只要是台电脑,硬件组成部分都是相通的。

mono 编译出的 il 可以看作面向对象版本的汇编语言,里面包含很多丰富的信息,比如可以用来查看是否有拆装箱的操作(unix):

ikdasm 1.exe | grep box

 

其实实现相同功能的中间语言在动态语言中也存在,比如 javascript 中的 asm.js,可以看成脚本版本的汇编(C/C++翻译成 asm.js 的前提下)。

谷歌就出了个 Emscripten 编译器用来将 C/C++ 编译成 asm.js。

如果理解了这些中间语言扮演的角色,其实就是告诉堆栈寄存器这些怎么去操作,那么当然每一门语言都可以写出这样的操作说明书,那不同语言之间当然可以写一个编译器将自己的这些操作翻译成另一门语言去表述。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM