转载请标明出处: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. Jmeter中实现base64加密

    Jmeter已不再提供内置base64加密函数,遇到base64加密需求,需要通过beanshell实现 直接上beanshell代码: import org.apache.commons.net.u ...

  2. DWM1000 Blink结构 -- 帧过滤第一节

    DWM1000 帧结构分析主要学习DWM1000 帧过滤功能,希望在目前DS-TWR定位系统中增加中断和帧过滤功能,帧过滤功能可以有效减少系统中的各个模块同时收发数据时的干扰问题,从而极大的提供系统稳 ...

  3. Numpy 基础运算2

    # -*- encoding:utf-8 -*- # Copyright (c) 2015 Shiye Inc. # All rights reserved. # # Author: ldq < ...

  4. Hive中的Order by与关系型数据库中的order by语句的异同点

    在Hive中,ORDER BY语句是对查询结果集进行整体的排序,最终将会产生一个reducer进行全局的排序,达到的最终结果是和传统的关系型数据库是一样的. 在数据量非常大的时候,全局排序的单个red ...

  5. Redis安装及使用

    1.我们可以通过在官网下载tar.gz的安装包,或者通过wget的方式下载 进入要下载到的文件夹: wget http://download.redis.io/releases/redis-4.0.1 ...

  6. group by 多个字段

    众所周知,group by 一个字段是根据这个字段进行分组,那么group by 多个字段的结果是什么呢?由前面的结论类比可以得到,group by 后跟多个子段就是根据多个字段进行分组 注:下面的例 ...

  7. ChartControl设置坐标轴范围

    需求:有一条坐标轴是用来表示百分比的,所以刻度范围只能是从0 - 100: 解决方法:运行chatcontrol设计器,选中需要设置的轴,如下图: 设置Whole range 的最大最小值: 默认情况 ...

  8. Reactjs项目性能优化

    在construct中绑定函数this shouldComponentUpdate React.PureComponent 无状态组件 chrome浏览器性能优化工具 setTimeout,setIn ...

  9. linux 使用sh@d0ws0cks client

    Linux Centos7下安装使用Shadowsocks客户端,实现*** 准备 SS: 搭建一个可以连接外网的服务器 教程可见 自己动手搭梯子 服务器:本人用的腾讯云服务器,系统为Centos7 ...

  10. powerdesigner 不能自动生成注释的解决方法(三步解决)

    解决power designer 不能自动生成注释的解决办法只需要3步: 一.快捷键 Ctrl+Shift+X 打开脚本编辑器:(快捷键不能执行的话可以从这个路径执行:Tools --> Exc ...