转载请标明出处:http://www.cnblogs.com/zblade/

一、IOS对DLL热更新的禁止
紧接上文,继续对C#热更新的研究。上文中,已经说了如何基于appDomain来实现对DLL的加载和卸载,进一步,可以在unity工程中,将Dll打包成资源,通过Assembly.Load的方式加载DLL来实现更新。那么为什么IOS中就不能这样操作了呢?
推荐阅读文章:
这两篇文章,对整个IOS不能热更新的缘由,有详细的讲解,对于Mono的JIT编译模式和AOT编译模式也有讲解。总结来说,就是由于IOS的Full AOT编译模式,不允许在IOS系统中动态生成代码(代码是可以在IOS中动态生成的,只是IOS为了安全性的考虑,禁止了内存的操作权限),所以JIT这种编译模式被Mono自己就禁止了(IOS下)。
既然不能JIT的编译,那么我们就不能基于Assembly.Load来加载DLL的bytes了。如何解决这个问题?让我们看看ILRuntime的解决思路。
 
二、ILRuntime基于IL虚拟机实现对DLL的热更新
首先看看ILRuntime对于其实现原理的解释:
ILRuntime借助Mono.Cecil库来读取DLL的PE信息,以及当中类型的所有信息,最终得到方法的IL汇编码,然后通过内置的IL解译执行虚拟机来执行DLL中的代码
那么,我们逐步来分析这些操作过程是如何执行的。
1、借助Mono.Ceil库来读取DLL的PE信息以及当中类型的所有信息
这一步是如何实现的,跟随源代码做一个详细的跟踪。
首先,是构建一个全局的appDomain(这儿不是程序域的意思,只是取其名字意思来表示)
 基于WWW的方式加载AssetBundle或者DLL/PDB后,接下来是将其封入到MemoryStream中,将dll和pdb的bytes都存入到内存流中后,执行其内部实现的LoadAssembly方法。

关键的是第一行,从Mono中加载模块:

 

进一步跟踪:
ReadImageFrom的操作:

 其中ImageReader最终来自BinaryReader:
 

那么接下来的ReadImage操作:

这四个操作,是最核心的操作,分别读取DLL的PE的各个信息,这样我们就进入下一个步骤。
2、最终得到方法的IL汇编码
让我们分拆来看看这几个读取函数的实现
1)ReadOptionalHeaders
主要读取PE的相关信息,不做过多解释,可以参看源码阅读理解;
2)ReadSections
读取分块数据
封装一个Section,然后去执行读取,然后赋值给section的Data,注意回退了Index
3)ReadCLIHeader
这步比较简单

4) ReadMetadata

核心是两个操作,一个是ReadMetadataStream,就是根据不同的标识符来新建不同的存储结构;一个是ReadTableHeap:

初始化heap中的Table后,进行一次Compute,获取size:

然后填充size:
基于这四步操作,我们可以将IL的汇编码存储到Image中,然后进一步执行后续的CreateModule操作:
具体到,就是:

其中的ReadModule为:

具体的读取manifest和Module内部数据,可以参看源码。
读取完module后,我们下一篇文章再详细讲解如何执行IL语句,这篇文章先写到这儿吧 :D
 

Unity实现c#热更新方案探究(二)的更多相关文章

  1. Unity实现c#热更新方案探究(三)

    转载请标明出处:http://www.cnblogs.com/zblade/ 前面两篇文章从头到尾讲解了C#热更新的一些方案,从程序域来加载和卸载DLL,到使用ILRuntime来实现安卓和IOS平台 ...

  2. Unity实现c#热更新方案探究(一)

    转载请标明出处:http://www.cnblogs.com/zblade/ 最近研究了一下如何在unity中实现c#的热更新,对于整个DLL热更新的过程和方案有一个初步的了解,这儿就写下来,便于后续 ...

  3. Unity官方发布热更新方案性能对照

    孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda •  什么是热更新 •  为何要热更新 •  怎样在iOS 上对 ...

  4. Unity代码热更新方案 JSBinding + SharpKit 首页

    目前Unity的代码更新方案有很多,主要以lua为主. JSBinding + SharpKit 是一种新的技术,他做了两件事情: JSBinding将C#导出到 JavaScript (引擎是 Mo ...

  5. unity热更新方案对比

    Unity应用的iOS热更新 •  什么是热更新 •  为何要热更新 •  怎样在iOS 上对Unity 应用进行热更新 •  支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...

  6. 【腾讯Bugly干货分享】手游热更新方案xLua开源:Unity3D下Lua编程解决方案

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2bY7A6ihK9IMcA0bOFyB-Q 导语 xL ...

  7. Unity3D 热更新方案(集合各位专家的汇总)

    http://blog.csdn.net/guofeng526/article/details/52662994 热更新”这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技 ...

  8. 腾讯开源手游热更新方案,Unity3D下的Lua编程

    原文:http://www.sohu.com/a/123334175_355140 作者|车雄生 编辑|木环 腾讯最近在开源方面的动作不断:先是微信跨平台基础组件Mars宣布开源,腾讯手游又于近期开源 ...

  9. Unity3D热更新方案网摘总结

    参考:http://blog.csdn.net/guofeng526/article/details/52662994 http://blog.csdn.net/u010019717/article/ ...

随机推荐

  1. nginx配置ssl验证

    在上一篇博客中,我们只是通过nginx搭建了反向代理服务,由于需要在小程序中使用https服务,所以需要申请安全证书. 1.在所购买的域名商那申请免费的ssl证书,我买的是阿里的,所以直接在阿里上申请 ...

  2. margin-top的兼容问题

    产生的条件:子元素给了margin-top,并且父元素没有浮也没有其他样式,浏览器解析的结果是父元素下去了. 解决方法:1.给子元素或者父元素添加浮动,缺点:如果不需要浮动,添加浮动也页面布局会乱 2 ...

  3. Python+Tkinter 实现计算器功能

    #=================================================================================== import tkinter ...

  4. 1、初识Java

    1.计算机发展过程 2.Java简史 lSUN公司是一家什么样的公司? 美国SUN(Stanford University Network)公司 在中国大陆的正式中文名为“太阳计算机系统(中国)有限公 ...

  5. 201771010118 马昕璐《面向对象程序设计java》第十周学习总结

    第一部分:理论知识学习部分 泛型:也称参数化类型(parameterized type)就是在定义类.接口和方法时,通过类型参数 指示将要处理的对象类型. 泛型程序设计(Generic program ...

  6. 漏测BUG借鉴

    2. websocket: 用户频繁刷新,后台每次请求新的排队,内存溢出 1. websocket: 北京中心连接正常,外地中心,连接超时,应考虑到外地延迟问题

  7. 手动安装composer详细教学

    1.下载compser.phar 地址 https://getcomposer.org/download/ 2.新建composer.bat 文件,写入“@php "%~dp0compose ...

  8. aarch64的架构:unrecognized command line option '-mfpu=neon'

    不用添加这个'-mfpu=neon'的编译器选项了,因为这个架构下neon是默认启动的. 参考: https://lists.linaro.org/pipermail/linaro-toolchain ...

  9. phpstorm 断点调试 傻瓜教程

    前言: 简单介绍下为什么要用断点调试,很多人说我在代码调试的部位用var_dump 或者 exit 或者print_r来进行断点,但是当项目足够大的时候这样的做法就比较费时费力,因为你断点后需要删除原 ...

  10. 使用 python 实现π的计算

    1.π的神奇 π是一个无数人追随的真正的神奇数字.我不是很清楚一个永远重复的无理数的迷人之处.在我看来,我乐于计算π,也就是计算π的值.因为π是一个无理数,它是无限的.这就意味着任何对π的计算都仅仅是 ...