转载请标明出处: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. GitHub 图片无法加载(持续更新)

    问题 Github无法加载或不显示图片(头像等) 方法 打开路径 C:\Windows\System32\drivers\etc下的hosts文件增加如下内容: 注:hosts文件一般不能直接修改保存 ...

  2. 什么是 SNI?

    参考: 链接1   链接2 介绍 是什么:SNI(Server Name Indication)是 TLS 的扩展,这允许在握手过程开始时通过客户端告诉它正在连接的服务器的主机名称. 作用:用来解决一 ...

  3. .Net类型 值类型

    预定义类型值类型 数据类型C#关键字(如 int.short 和 string) 从编译器映射到.NET数据类型.例如,在C#中声明一个int类型的数据时声明的实际是.Net System.Int32 ...

  4. 记一次LLVM平行宇宙修包实战

      最近加入了LLVM平行宇宙计划小组,在小组内提交了一定数量的PR.这个计划究竟是做什么的呢?LLVM平行宇宙计划是基于LLVM技术栈构建openEuler软件包,大白话讲就是原本一个软件包是用gc ...

  5. 用 DeepSeek 分析,SaaS 多租户的3种隔离模式,结果。。。

    大家好,我是汤师爷~ 在SaaS模式下,多租户之间的资源隔离是基础且关键的一环. SaaS服务商需要在确保运营效率和控制成本的前提下,搭建一个让多个租户能够同时访问的共享环境. 虽然大家都在用同一套S ...

  6. 虚拟机设置静态IP并启用桥接模式

    虚拟机设置静态IP并启用桥接模式 一.准备工作 在开始之前,请确保你已经安装了VMware或其他虚拟机软件,并且已经创建了一个虚拟机实例. 此外,还需要了解宿主机的网络配置,包括IP地址.子网掩码.网 ...

  7. Flink程序异常--CommunicationsException: The last packet successfully received from the server was

    一.异常截图 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully receive ...

  8. Doris插入数据底层存储测试

    建表语句 CREATE TABLE IF NOT EXISTS base_site_test( site_id INT DEFAULT '10', city_code INT, user_name V ...

  9. 开源一款I2C电机驱动扩展板-FreakStudio多米诺系列

    总线直流电机扩展板 原文链接: FreakStudio的博客 摘要 设计了一个I2C电机驱动板,通过I2C接口控制多个电机的转速和方向,支持刹车和减速功能.可连接16个扩展板,具有PWM输出.过流过热 ...

  10. 1Panel 专业版评测:全面超越宝塔的运维面板新标杆

    一. UX体验与移动端适配:更直观的跨平台交互 1Panel 专业版在用户体验上实现了对宝塔的全面超越.其界面采用现代化设计语言,以黑金主题为代表的可定制化主题系统支持一键切换,视觉风格更符合技术审美 ...