mono部分源码解析
一、源码结构
这里仅列举几个重要的目录:
mcs:
mcs: Mono实现的基于Ecma标准的C#编译器。
class: CLI的C#级的实现。类似于Android中的Java层,应用程序看到的是这一层提供的接口。这一层是平台无关的。
ilasm: 反汇编器,将Native code反汇编成bytecode。
mono:
mini: JIT编译器,将bytecode编译成native code。
metadata: Mono的runtime,CLI的Native级的实现。
io-layer: 与操作系统相关的接口实现,像socket,thread,mutex这些。
libgc: GC实现的一部分。
mono的结构:
C#编译器mcs 产生:DLL形式的bytecode(具体位置为Managed文件夹下UnityEngine.dll)
| JIT编译器 |
| runtime |
| 操作系统接口 |
产生:DLL形式的native code(Mono文件夹下的mono.dll)
二、mono主要工作框架
mini/main.c: main()
mono_main_with_options()
mono_main()
mini_init()
mono_assembly_open()
main_thread_handler() // assembly(也就是bytecode)的编译执行
mini_cleanup() main_thread_handler()
mono_jit_exec()
mono_assembly_get_image() // 得到image信息,如"test.exe"
mono_image_get_entry_point() // 得到类,方法信息
mono_runtime_run_main(method, argc, argv, NULL)
mono_thread_set_main(mono_thread_current()) // 将当前线程设为主线程
mono_assembly_set_main()
mono_runtime_exec_main() // 编译及调用目标方法 mono_runtime_exec_main()
mono_runtime_invoke(method, NULL, pa, exc) // 要调用的方法,如"ClassName::Main()"
default_mono_runtime_invoke() // 实际上是调用了mono_jit_runtime_invoke()
info->compiled_method = mono_jit_compile_method_with_opt(method) // 编译目标函数
info->runtime_invoke = mono_jit_compile_method() // 编译目标函数的runtime wrapper
mono_jit_compile_method_with_opt(method, default_opt, &ex)
runtime_invoke = info->runtime_invoke
runtime_invoke(obj, params, exc, info->compiled_method) // 调用wrapper,wrapper会调用目标方法 mono_jit_compile_method_with_opt()
mono_jit_compile_method_inner()
mini_method_compile(method, opt, target_domain, TRUE, FALSE, ) // 通过JIT编译给定方法
mono_runtime_class_init_full() // 初始化方法所在对象
method = mono_class_get_cctor() // 得到类的构造函数
if (do_initialization) // 对象需要初始化
mono_runtime_invoke() // 调用相应构造函数来构造对象,如"System.console:.cctor()"
mono_jit_runtime_invoke()
运行过程中会调用到mono_jit_runtime_invoke()
mono部分源码解析的更多相关文章
- 【转】Java HashMap 源码解析(好文章)
.fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- jQuery2.x源码解析(缓存篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...
- Spring IoC源码解析——Bean的创建和初始化
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
- jQuery2.x源码解析(构建篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...
- jQuery2.x源码解析(设计篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...
随机推荐
- 优化cocos2d/x程序的内存使用和程序大小
本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/1043.html ☞ ...
- Java eclipse Myeclipse tomcat安装及配置
Java eclipse Myeclipse tomcat安装及配置作者:天涯 来源:中国自学编程网 发布日期:1223857747目前,开发Java网页程序,最流行的就是用Myeclipse来进行编 ...
- Windows 下python的tab自动补全
方法一:安装一个ipython就OK啦,而且关键字还能高亮显示呢 一.打开cmd,输入pip3 install ipython联网安装 二.安装成功后,cmd里运行ipython,成功啦. 方法二:写 ...
- 4.1 shell文本过滤、find、awk、grep
文本过滤涉及到以下知识: 正则表达式.find.grep.awk.sed.合并与分割(sort.uniq.join.cut.paste.split). 正则表达式: 基本元字符集及其含义: 匹配IP地 ...
- 【linux】使用swap文件恢复非正常关闭的文件
前言 使用vim的时候,文件编辑过程中可能会出现bug,导致非正常关闭.为了保存刚刚修改的内容,需要对文件进行恢复. 操作过程 1.查看目录文件 zrj@zrj-ThinkPad-E470:~/wor ...
- 高并发中nginx较优的配置
一.这里的优化主要是指对nginx的配置优化,一般来说nginx配置文件中对优化比较有作用的主要有以下几项: 1.nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数. wor ...
- 为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
如果你的团队没有觉得微信是低效的团队 IM 工具,那只有两种可能: 团队成员很少使用微信进行私人的生活和娱乐. 你就是一个低效的团队,而且还不自知. 本文内容 微信,连接一切 每个人都有微信 微信,低 ...
- proc文件系统漫谈
1. /proc/buddyinfo:/proc/buddyinfo是linuxbuddy系统管理物理内存的debug信息. 在linux中使用buddy算法解决物理内存的外碎片问题,其把所有空闲的内 ...
- alpha和color key
一.alpha 1.透明度,一般取值0-255 2.Alpha 通道: Alpha 通道是为保存选择区域而专门设计的通道.在生成一个图像文件时,并不必须产生 Alpha 通道.通常它是由人们在图 ...
- NoSQLUnit
NoSQLUnit Core Overview Unit testing is a method by which the smallest testable part of an applicati ...