一、源码结构

这里仅列举几个重要的目录:
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部分源码解析的更多相关文章

  1. 【转】Java HashMap 源码解析(好文章)

    ­ .fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  5. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  6. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  7. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  8. jQuery2.x源码解析(构建篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...

  9. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

随机推荐

  1. 正则表达式,清除HTML标签,但要保留 <br>和<img>标签,其他的清除

    最近有个需求, 要替换到html当中的除了br和img以外的所有标签, 遂百度之, 在百度知道遇到大神 , 在这记录一下 /<(?!\/?br\/?.+?>|\/?img.+?>)[ ...

  2. tensorflow中 tf.add_to_collection、 tf.get_collection 和 tf.add_n函数

    tf.add_to_collection(name, value)  用来把一个value放入名称是'name'的集合,组成一个列表; tf.get_collection(key, scope=Non ...

  3. Python模块 实现过渡性模块重载

    本文是在阅读Python 学习手册后  感觉比较不错的一个实现模块重载的一个模块,该模块可以实现对已经加载在运行程序中的模块实现重新加载,并且该模块可以递归的实现对要重新加载的模块内所引用的其它模块的 ...

  4. .NET练习计算平方根

    1.新建Windows窗体 2.窗体中添加控件:TextBox(文本框).Button(按钮).和Label(标签) 3.为Button对象添加点击事件代码 点击事件代码设计思路 ①从文本框中获取输入 ...

  5. Linux Framebuffer save as picture

    /********************************************************************************* * Linux Framebuff ...

  6. 20155224 2016-2017-2 《Java程序设计》第5周学习总结

    20155224 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 Java中的错误都会被打包为对象,可以尝试(try)捕捉(catch)代表错误的对象 ...

  7. BZOJ4916: 神犇和蒟蒻【杜教筛】

    Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你 ...

  8. ostringstream的用法

    使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性.类型安全和可扩展性.在本文中, ...

  9. python学习之-软件开发的目录规范

    通常软件目录下有几个标准文件夹 软件主文件夹命名,通常都是大写(ATM_SHOPPING) ------------------------------------------------------ ...

  10. test20190320 全连(fc)

    题意 全连(fc) [题目背景] 还记得若干年前那段互相比较<克罗地亚狂想曲>的分数的日子吗? [题目描述] E.Space 喜欢打音游. 但是他技术不好,总是拿不到全连(Full Com ...