程序笔记   发布时间:2022-07-17  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了(转)Unity实现c#热更新方案探究(二)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

(转)Unity实现c#热更新方案探究(二)

@H_944_85@

 

@H_944_85@ 基于WWW的方式加载AssetBundle或者DLL/PDB后,接下来是将其封入到MemoryStream中,将dll和pdb的bytes都存入到内存流中后,执行其内部实现的LoadAssembly方法。
@H_944_85@

(转)Unity实现c#热更新方案探究(二)

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

@H_944_85@ 

(转)Unity实现c#热更新方案探究(二)

@H_772_114@进一步跟踪:
ReadImageFrom的操作:

(转)Unity实现c#热更新方案探究(二)

 

@H_944_85@ 其中ImageReader最终来自BinaryReader: @H_944_85@ 

(转)Unity实现c#热更新方案探究(二)

那么接下来的ReadImage操作:

(转)Unity实现c#热更新方案探究(二)

这四个操作,是最核心的操作,分别读取DLL的PE的各个信息,这样我们就进入下一个步骤。
2、最终得到方法的IL汇编码
让我们分拆来看看这几个读取函数的实现
1)ReadoptionalHeaders
主要读取PE的相关信息,不做过多解释,可以参看源码阅读理解;
2)ReadSections
取分块数

(转)Unity实现c#热更新方案探究(二)

封装一个Section,然后去执行读取,然后赋值给section的Data,注意回退了Index
3)ReadCLIHeader
这步比较简单

 

(转)Unity实现c#热更新方案探究(二)

4) ReadMetadata

(转)Unity实现c#热更新方案探究(二)

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

(转)Unity实现c#热更新方案探究(二)

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

(转)Unity实现c#热更新方案探究(二)

然后填充size:

(转)Unity实现c#热更新方案探究(二)

@H_301_262@
基于这四步操作,我们可以将IL的汇编码存储到Image中,然后进一步执行后续的CreateModule操作:

(转)Unity实现c#热更新方案探究(二)

具体到,就是:
@H_944_85@ 

(转)Unity实现c#热更新方案探究(二)

其中的ReadModule为:

(转)Unity实现c#热更新方案探究(二)

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

大佬总结

以上是大佬教程为你收集整理的(转)Unity实现c#热更新方案探究(二)全部内容,希望文章能够帮你解决(转)Unity实现c#热更新方案探究(二)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:loadlruphp源码源码阅读程序员资源
猜你在找的程序笔记相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap