开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1720

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 3408|回复: 42

[东方喵] 【UnityHotUpdate】(一)利用C#的反射动态加载程序集

[复制链接]  [移动端链接]
排名
1308
昨日变化
5

26

主题

771

帖子

2608

积分

Rank: 9Rank: 9Rank: 9

UID
76248
好友
16
蛮牛币
15739
威望
0
注册时间
2015-2-28
在线时间
671 小时
最后登录
2017-6-22

专栏作家蛮牛译员活力之星七夕浪漫情人

发表于 2017-4-12 15:04:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 东方喵 于 2017-4-12 15:06 编辑

利用C#的反射动态加载程序集
注意:此方案不适用于IOS,一者,2017/3/8苹果官方正式禁止使用任何热更新技术,即禁止绕过苹果审核的更新;二者,先前苹果允许使用lua/js等脚本动态更新时,这种动态加载链接库的热更新方式也是被禁止的。

——何为热更新?
热更新即为在用户不关闭程序的前提下动态的更新代码和资源。

——为何热更新?
如果不使用热更新,则每次更新时,用户都必须下载完整客户端,为了减少更新时需要下载文件的大小,我们使用热更新。

热更新方案有很多,第一篇讲一下虽不通用,但最简单的反射动态加载程序集的方案。
在此,我就用本地加载的方式模拟一下作为示例,网络下载与之类似;
首先,在Visual Studio中新建一个项目,作为类库。
000.png
然后,添加引用。
001.png
添加我们需要引用的类库。
002.png
稍微搓一
点儿测试代码。
003.png
生成dll文件,此时已经可以在Debug文件夹下找到我们生成的动态链接库dll了。
004.png
打开unity:
1.将我们的dll文件导入工程,并把文件名后缀改为“.bytes”;
2.将
.bytes文件打为AB包(注意打包目标平台),创建并将AB包放到StreamingAssets目录下,删除原“.bytes"文件;
3.
新建一个场景,创建一个UGUI的Text;
4.最后创建一个简单的加载脚本。
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
public class xxx : MonoBehaviour {
    byte[] bytes;
        void Start () {
        StartCoroutine(loadScript());
    }
    IEnumerator loadScript()
    {
        WWW www = new WWW("file://"+Application.streamingAssetsPath+"/test.unity3d");
        yield return www;
        AssetBundle bundle = www.assetBundle;
        TextAsset asset = bundle.LoadAsset("test", typeof(TextAsset)) as TextAsset;
        //C#反射取出程序集  
        System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(asset.bytes);
        //加载程序集中的脚本test.cs  
        gameObject.AddComponent(assembly.GetType("test"));
    }
}


将此脚本挂在text上。
005.png

运行效果如下,成功在运行时将www下来的AB包解压出来,作为TextAsset,然后用反射出其程序集。
006.png

ps:在安卓上使用时也有一些注意事项:
1.不能使用Assembly.LoadFile(string path),只能使用Assembly.Load(byte[] rawAssembly);
2.我们需要动态加载的脚本不能在编辑器里挂在prefab上,会获取到奇怪的脚本,因为这个脚本在原项目和AB包中都存,并且存在于两个不同的程序集里,不会互相覆盖。
3.由于是存在于两个程序集中,调用AddComponent()时不能使用AddComponent<某>(),要用AddComponent(Type.GetType(“SomeScript”))。
4.在动态dll里使用[RequireComponent(typeof(SomeScript))]无效。

最后奉上工程:
HotUpdateTest.rar (546.02 KB, 下载次数: 118)

评分

参与人数 6鲜花 +69 收起 理由
kass0615 + 5 很给力!
goonangel + 2 很给力!
kckbkckb2 + 5 很给力!
kusu2008 + 5 很给力!
lixiaobai + 2 很给力!
朱迪 + 50 很给力!

查看全部评分


回复

使用道具 举报

5熟悉之中
576/1000
排名
4102
昨日变化
1

5

主题

93

帖子

576

积分

Rank: 5Rank: 5

UID
61625
好友
3
蛮牛币
1529
威望
0
注册时间
2014-12-16
在线时间
220 小时
最后登录
2017-6-22
发表于 2017-4-12 16:11:27 | 显示全部楼层
本帖最后由 longchuang 于 2017-6-6 11:07 编辑

加油!!!!!!!!!!!!!!

回复

使用道具 举报

5熟悉之中
674/1000
排名
4300
昨日变化
36

0

主题

301

帖子

674

积分

Rank: 5Rank: 5

UID
3796
好友
0
蛮牛币
801
威望
0
注册时间
2013-9-13
在线时间
137 小时
最后登录
2017-6-22
发表于 2017-4-12 17:07:42 | 显示全部楼层
厉害!!!

回复

使用道具 举报

6蛮牛粉丝
1262/1500
排名
3351
昨日变化
17

8

主题

749

帖子

1262

积分

Rank: 6Rank: 6Rank: 6

UID
132417
好友
0
蛮牛币
2582
威望
0
注册时间
2015-12-23
在线时间
189 小时
最后登录
2017-6-22
发表于 2017-4-13 09:56:27 | 显示全部楼层
学习学习,谢谢楼主分享

回复 支持 反对

使用道具 举报

2初来乍到
105/150
排名
17277
昨日变化
14

0

主题

34

帖子

105

积分

Rank: 2Rank: 2

UID
102020
好友
0
蛮牛币
57
威望
0
注册时间
2015-5-21
在线时间
52 小时
最后登录
2017-4-28
发表于 2017-4-13 15:39:45 | 显示全部楼层
学到了,之前看的热更新都会提到这个,但是一直不知道怎么实现的

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1466/1500
排名
17277
昨日变化
14

2

主题

1246

帖子

1466

积分

Rank: 6Rank: 6Rank: 6

UID
185807
好友
0
蛮牛币
1751
威望
0
注册时间
2016-11-22
在线时间
198 小时
最后登录
2017-6-21
发表于 2017-4-13 18:06:19 | 显示全部楼层
赞,不错,学习了,谢谢分享

回复 支持 反对

使用道具 举报

5熟悉之中
546/1000
排名
4863
昨日变化
1

5

主题

195

帖子

546

积分

Rank: 5Rank: 5

UID
187870
好友
0
蛮牛币
894
威望
0
注册时间
2016-11-29
在线时间
143 小时
最后登录
2017-6-20
发表于 2017-4-14 08:44:36 | 显示全部楼层
好人一生平安

回复

使用道具 举报

7日久生情
1602/5000
排名
339
昨日变化
1

0

主题

37

帖子

1602

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
9580
好友
1
蛮牛币
4393
威望
0
注册时间
2013-12-4
在线时间
239 小时
最后登录
2017-6-21
发表于 2017-4-14 08:45:49 | 显示全部楼层
超厲害的~謝謝分享

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1111/1500
排名
1239
昨日变化
3

2

主题

71

帖子

1111

积分

Rank: 6Rank: 6Rank: 6

UID
133503
好友
2
蛮牛币
2941
威望
0
注册时间
2016-1-5
在线时间
302 小时
最后登录
2017-6-17
QQ
发表于 2017-4-14 08:51:27 | 显示全部楼层
膜拜

回复

使用道具 举报

6蛮牛粉丝
1058/1500
排名
2040
昨日变化
8

1

主题

306

帖子

1058

积分

Rank: 6Rank: 6Rank: 6

UID
56496
好友
0
蛮牛币
2837
威望
0
注册时间
2014-11-19
在线时间
251 小时
最后登录
2017-6-22
发表于 2017-4-14 10:10:28 | 显示全部楼层
miao  ao   很好

回复 支持 反对

使用道具 举报

2初来乍到
118/150
排名
15007
昨日变化
16

0

主题

73

帖子

118

积分

Rank: 2Rank: 2

UID
212868
好友
0
蛮牛币
177
威望
0
注册时间
2017-3-18
在线时间
19 小时
最后登录
2017-6-20
发表于 2017-4-15 22:22:12 | 显示全部楼层
给力。。。。

回复

使用道具 举报

5熟悉之中
779/1000
排名
2078
昨日变化
6

0

主题

97

帖子

779

积分

Rank: 5Rank: 5

UID
137070
好友
0
蛮牛币
1687
威望
0
注册时间
2016-2-20
在线时间
190 小时
最后登录
2017-6-22
发表于 2017-4-16 19:05:30 | 显示全部楼层
感谢楼主分享!
[发帖际遇]: kckbkckb2 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1117/1500
排名
1962
昨日变化
10

23

主题

281

帖子

1117

积分

Rank: 6Rank: 6Rank: 6

UID
89788
好友
1
蛮牛币
1776
威望
0
注册时间
2015-4-7
在线时间
289 小时
最后登录
2017-6-22
发表于 2017-4-17 14:50:03 | 显示全部楼层
可以可以
谢谢楼主

回复 支持 反对

使用道具 举报

3偶尔光临
227/300
排名
8382
昨日变化
113

0

主题

54

帖子

227

积分

Rank: 3Rank: 3Rank: 3

UID
131556
好友
0
蛮牛币
181
威望
0
注册时间
2015-12-12
在线时间
79 小时
最后登录
2017-6-22
发表于 2017-4-18 09:17:13 | 显示全部楼层
{:87:}

回复

使用道具 举报

3偶尔光临
266/300
排名
7566
昨日变化
3

0

主题

101

帖子

266

积分

Rank: 3Rank: 3Rank: 3

UID
91378
好友
1
蛮牛币
281
威望
0
注册时间
2015-4-11
在线时间
55 小时
最后登录
2017-6-20
发表于 2017-4-19 09:55:51 | 显示全部楼层
谢谢楼主分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表