转载请标明出处:http://www.cnblogs.com/zblade/
对于游戏中的热更,目前主流的解决方案,分为Lua(ulua/slua/xlua/tolua)系和ILRuntime代表的c#系。今天就来探究一下ILRuntime是如何实现热更的流程的,新手入门,个中有错误理解,欢迎指正。
ILRuntime的原理
首先说一下lua的热更新基本过程,unity提供了AssetBundle的资源打包方式,这样可以通过资源的对比来更新最新的资源。而lua文件不需要编译,可以被打包进游戏的资源中,在游戏启动的过程中加载对应的脚本资源,今儿解释执行转换为字节码,在lua的虚拟机中执行,这种天然的设计,可以规避静态语言需要编译的环节。
C#代码在编写后,是需要执行编译的,才能起效,这样如果在手机端,没有对应的编译环境,那么对应的c#代码就无法实现热更。ILRuntime实现的基础,也是基于AssetBundle的资源热更新方式,将需要热更新的c#代码打包成DLL,放在工程的StreamingAssets下,在每次完成资源打包后,对应的DLL会被作为资源热更新出去。这样就规避了编译相关的环节,实现了热更。
文字讲述较为枯燥,看看示例代码是如何执行这个流程的:
1、ILRuntime的相关资料链接
可以在github上查找: ILRuntime
对应的unity3d的工程的例子:ILRuntime U3D例子
 
2、探究ILRuntime的例子
整个例子分为两个部分:
分别是热更新的工程和U3D主工程,那么先看看U3D工程:
较为重要的是两个部分,一个是ILRuntime需要用到的几个环境,重点是Mono.Ceil.20, Mono.Ceil.Pdb,ILRuntime三个文件夹,ILRuntime后续的版本将LitJson也加入进来了。
另一个关键点就是讲HotFix_Project.dll作为资源加入到StreamingAssets文件夹下,这样就可以被ab打包作为资源热更新出去。
接下来我们打开HotFix_Project:
 
得到的工程为:
 

重点分析一下引用,可以看到,该工程是引用了UnityEngine/UnityEngine.UI/Assembly-CSharp等几个U3D游戏主工程中的dll的,这样,可以在工程中直接调用对应的u3d相关的dll下的类和方法,示例代码:

 

只要using UnityEngine申明后,下面的代码就可以继承MonoBehaviour类,自然可以调用其中的相关类和方法。那么到这一步,就可以理解,在HotFix_Project中,我们是可以调用U3D游戏主工程的类和方法的,只要添加其相关的dll到工程的引用中。这样我们就完成了HotFix对U3D游戏主工程的调用的一条线路。

3、U3D游戏主工程调用HotFix_Project中的类型和相关方法
现在的调用都是交互式的,在完成了hotfix对u3d的调用后,我们接下来看看u3d是如何调用hotfix中的类和方法的。
取我们最常见和关注的反射作为一个示例,这样可以了解整个调用过程。
首先,需要加载hotfix的dll,来看看相关的代码:
 

整个竖屏截出来的图比较大,跟随箭头来看看流程:
1) 首先MonoBehaviour下的Start执行一个协程;
2) 实例化唯一的appdomain;
3) 加载hotfix的dll和pdb,可以看到,如果我们热更新相关的dll和pdb,是需要在这一步之前执行的,其实可以放在Awake中执行,当然这儿没有热更,我们就直接执行dll和pdb的加载;
4) 在完成dll和pdb的加载后,执行assembly的加载,这样我们可以获取到hotfix中的相关类和方法,属性等相关信息,相关可以查看源码即可了解。
5) 测试如何调用反射:
        Debug.Log("热更DLL中的类型我们均需要通过AppDomain取得");
var it = appdomain.LoadedTypes["HotFix_Project.InstanceClass"];
Debug.Log("LoadedTypes返回的是IType类型,但是我们需要获得对应的System.Type才能继续使用反射接口");
var type = it.ReflectionType;
Debug.Log("取得Type之后就可以按照我们熟悉的方式来反射调用了");
var ctor = type.GetConstructor(new System.Type[]);
var obj = ctor.Invoke(null);
Debug.Log("打印一下结果");
Debug.Log(obj);
Debug.Log("我们试一下用反射给字段赋值");
var fi = type.GetField("id", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
fi.SetValue(obj, );
Debug.Log("我们用反射调用属性检查刚刚的赋值");
var pi = type.GetProperty("ID");
Debug.Log("ID = " + pi.GetValue(obj, null));
让我们看看整个流程:
基于appdomain来获取类,然后获取type,对应的invoke, 也可以利用反射来修改对应的field的值。
 
总结:到这儿,我们就基本理清楚了基于ILRuntime如何实现hotfix和u3d主工程之间的相互调用,可以讲这样一套热更新方式嵌套到游戏的框架中,实现不用lua来实现热更。当然ILRuntime要转换到IL2CPP,还是有很多地方需要注意的,详情可以参考github上的相关手册。
 
 
 
 

对C#热更新方案ILRuntime的探究的更多相关文章

  1. unity 热更新方案ILRuntime

    https://github.com/meta-42/ILRuntime 教程 https://ourpalm.github.io/ILRuntime/public/v1/guide/index.ht ...

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

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

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

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

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

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

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

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

  6. Unity3D 热更新方案总结

    如何评价腾讯在Unity下的xLua(开源)热更方案? Unity 游戏用XLua的HotFix实现热更原理揭秘 腾讯开源手游热更新方案,Unity3D下的Lua编程 [Unity]基于IL代码注入的 ...

  7. 移动端热更新方案(iOS+Android)

    PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...

  8. iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET

    iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET Weex

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

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

随机推荐

  1. 手把手带你画一个动态错误提示 Android自定义view

    嗯..再差1篇就可以获得持之以恒徽章了,今天带大家画一个比较简单的view. 转载请注明出处:http://blog.csdn.net/wingichoy/article/details/504771 ...

  2. SQLServer 基础

    1当设计表时,对表进行结构性的修改(如将原来可以null的改为不可null),直接改则不允许保存修改,需要选择 工具----选项----designers—表设计器和数据库设计器---阻止保持要求重新 ...

  3. 【一天一道LeetCode】#11Container With Most Water

    一天一道LeetCode系列 (一)题目 Given n non-negative integers a1, a2, -, an, where each represents a point at c ...

  4. RTMPdump 使用说明

    RTMPDump v2.4 2012-07-24RTMPDUMP(1) 名称 rtmpdump - (RTMP流媒体客户端)RTMP streaming media client 使用参数 rtmpd ...

  5. Linux磁盘 - fdisk,partprobe, mkfs, mke2fs, fsck, badblocks, mount, mknod

    磁盘分区: fdisk [root@www ~]# fdisk [-l] 装置名称 选项与参数: -l :输出后面接的装置所有的 partition 内容.若仅有 fdisk -l 时, 则系统将会把 ...

  6. HBase提供的工具

    1 .压缩测试工具   hbase org.apache.hadoop.hbase.util.CompressionTest   1G数据不同的压缩算法得到的结果 +----------------- ...

  7. Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现以及ListView的优化

    Android实训案例(五)--四大组件之一ContentProvider的使用,通讯录的实现 Android四大组件是啥这里就不用多说了,看图吧,他们之间通过intent通讯 我们后续也会一一的为大 ...

  8. spring+mybaits多数据源使用

    一.在利用spring管理mybatis时可以同时配置多个数据源,并且数据源可以随时切换,但在多线程中多数据源的事务需要一定的配置. 多数据源配置: <bean id="postgre ...

  9. Http的会话跟踪和跨站攻击(xss)

    会话跟踪 什么是会话? 客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话. 什么是会话跟踪? 会话跟踪指的是对同一个用户对服务器的连续的请求和接受响应的监视. 为什么需要会话跟 ...

  10. rails自动生成大量记录的方法

    因为我们可能rails new了一个网站出来,但是里面没有测试数据,我们不能傻乎乎的在new.html.erb里面一个的手动输入吧?于是我们可以写一个小的脚本来帮助在数据库中插入大量数据:高版本的ra ...