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

最近研究了一下如何在unity中实现c#的热更新,对于整个DLL热更新的过程和方案有一个初步的了解,这儿就写下来,便于后续的深入调查和方案选择。
一、C# DLL的动态加载和卸载
既然要热更新,那么就是动态的加载c#的DLL,所以第一步就是研究如何实现DLL的动态加载和卸载。
在CLR Via C#中,对于DLL的加载有详细的讲解,这儿就不再长篇幅的讲解整个过程,简单的来说,在C#的工程中,都会生成一个默认的程序域appDomain,就叫做DefaultAppDomain吧,在这个程序域的基础上,我们可以加载多个不同的程序集。在.Net中,程序集不能卸载,但是可以随着程序域的释放而一起释放,所以我们可以利用程序域来实现程序集(DLL)的加载和释放。

上面的理论来自CLR Via C#, 具体的图为:

基于这个理论,我们可以在DefaultAppDomain之外,再多次创建多个AppDomain,基于AppDomain来实现DLL的加载和卸载。基于此,编写相关的工程测试,参考网上的一个工程来进一步的测试,这儿是原文,文末有相关的代码下载:
在原代码的基础上,进一步构建。首先,构建4个Class Library:

默认工程为MainServer,将Module1和Module2的Build路径设置到MainServer的bin中,这样MainServer就可以加载最新的Module1.DLL/Module2.DLL(PS:这儿的设置很重要,忽略会使得不能加载最新的DLL)
Module1和Module2都在References中添加CommonLib的引用,实现ICalculater接口,各自的实现为:
Module1:

Module2:

这样,就是两个不同的Class Library中,分别实现了ICalculater接口,分别为相加和相乘。在MainServer的主程序入口Program中:

首先在默认appDomain的基础上,进一步加载2个appDomain,然后分别在这2个程序域的基础上加载DLL。得到的结果为:

整个步骤都详细的解释了整个执行流程,先构建appDomain,在此基础上,加载dll,然后执行里面的方法。再一个新的appDomain中加载前面加载过的dll,再次执行,相互之间并不冲突。所以appDomain可以一对多个DLL,一个DLL可以被多个不同的AppDomain加载。

二、Unity中测试DLL的加载
在第一部分的基础上,我们进一步的研究如何在Unity中实现Dll的加载,基本的操作步骤可以参考这篇文章:unity dll实现热更新
当然,文章并不是完全的实现热更新,实现的是windows和android平台下,对于dll文件的热更新。对于IOS为什么不能热更新,我们后续会讨论到,先看看安卓和windows下 dll的热更新步骤。
1、新建一个ClassLibrary(类库)的工程,在其中实现对应的类和方法;
2、将该工程导出为DLL;
3、将DLL改为bytes文件,存入Unity工程中的StreamingAssets文件夹下;
4、在工程运行的时候,读取StreamingAssets下的Dll文件,用Assembly.Load(byte[] bytes )的方法,将DLL文件读取出来,进而执行相关的操作。这一步的代码为:

对于DLL文件,是执行www.bytes,对于assetbundle文件,则是执行ab.mainAsset转换为TextAsset,进一步得到bytes。在windows和android平台下,都会得到这样的屏幕输出:

这个方案的本质,和前面的本质相差不大,unity工程在执行的时候,会构建一个默认的appDomain,Assembly.Load,其实就是在这个程序域上加载Dll,所以相关的实质和前面一个部分相差不大,这就是c#热更新在unity中的应用(IOS不包括)。

下文我们会讲解IOS为什么不支持DLL的热更新,以及如何利用ILRuntime来实现Android和IOS的热更新。

il热更新(一)的更多相关文章

  1. 深入理解xLua基于IL代码注入的热更新原理

    目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题.另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一. 热更新可以 ...

  2. Unity3D逻辑热更新,第二代舒爽解决方案,L#使用简介

    热更新 天下武功,无坚不破,唯快不破 热更新就是为了更快的把内容推到用户手中. 之前,我设计了C#Light,经过半年多的持续修补,勉强可用,磕磕绊绊.感谢那些,试过,骂过,用过的朋友,在你们的陪伴下 ...

  3. Unity3D热更新全书FAQ

    只要有程序员朋友们问过两次的问题 就会收录在此FAQ中 1.C#Light对比LUA有什么好处 C#Light是静态类型脚本语言,语法同C#,Lua是动态类型脚本语言,这两种都有人喜欢. 我更喜欢静态 ...

  4. 另类Unity热更新大法:代码注入式补丁热更新

    对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...

  5. 手游热更新方案--Unity3D下的CsToLua技术

    WeTest 导读 CsToLua工具将客户端 C#源码自动转换为Lua,实现热更新,本文以麻将项目为例介绍客户端技术细节. 麻将项目架构 其中ChinaMahjong-CSLua为C#工程,实现麻将 ...

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

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

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

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.IOS对DLL热更新的禁止 紧接上文,继续对C#热更新的研究.上文中,已经说了如何基于appDomain来实现对DLL ...

  8. Unity3D 热更新方案总结

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

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

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

  10. Unity热更新对比

    https://www.jianshu.com/p/f9d90edf4a7c Unity 热更新为啥用Lua 详解 ILRuntime的优势 同市面上的其他热更方案相比,ILRuntime主要有以下优 ...

随机推荐

  1. G1原理—10.如何优化G1中的FGC

    大纲 1.G1的FGC可以优化的点 2.一个bug导致的FGC(Kafka发送重试 + subList导致List越来越大) 3.为什么G1的FGC比ParNew + CMS要更严重 4.FGC的一些 ...

  2. BGV12

    BGV12,论文:(Leveled) Fully Homomorphic Encryption without Bootstrapping 密钥交换 ️ 矩阵\(A_{N*n_2}\) 矩阵\(B_{ ...

  3. linux:配置NTP

    介绍 网络时间协议(Network Time Protocol,NTP),用于同步网络中各个计算机的时间的协议.其用途是将计算机的时钟同步到世界协调时 UTC. ntpd(Network Time P ...

  4. 159:更改shell环境

  5. 「youlai-boot」入门篇:从0到1搭建 Java、Spring Boot、Spring Security 企业级权限管理系统

    作者主页: 有来技术 开源项目: youlai-mall︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 仓库主页: GitCode︱ Gitee ...

  6. java中的HsahMap

    HsahMap HashMap 是 Java 中最常用的集合类之一,它实现了 Map 接口,基于哈希表存储键值对 HashMap的存储是无顺序的 HashMap存储的是键值对(key-value)其中 ...

  7. vue-element-admin改为从后台获取菜单

    一.修改文件\src\router\index.js 文件的asyncRoutes清理为 export const asyncRoutes = [ { path: '*', redirect: '/4 ...

  8. VS2019 MSB6006 "CL.exe"已退出,错误代码 5

    以下为我的解决过程: 因为我不是干C++的,而且我们内网不通外网,我当初来的时候装的vs2019全家桶,然后他们开发用的是vs2015,项目有用c++做图像处理的东西,我本地的vs2015没有C++模 ...

  9. Flume - [08] 绝密档案Ⅰ

    题记部分 (1)Flume使用场景   线上数据一般主要是落地(存储到磁盘)或者通过socket传输给另一个系统,这种情况下,你很难推动线上应用或服务去修改接口,实现直接向kafka里写数据,这时候你 ...

  10. SpringBoot三种获取Request和Response的方法

    通过静态方法获取,你也可以封装一个静态方法出来 @GetMapping(value = "") public String center() { ServletRequestAtt ...