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

扫一扫,访问微社区

开发者专栏

关注:2173

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

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

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

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

  [复制链接]  [移动端链接]
排名
776
昨日变化
2

34

主题

810

帖子

3441

积分

Rank: 9Rank: 9Rank: 9

UID
76248
好友
21
蛮牛币
18524
威望
0
注册时间
2015-2-28
在线时间
913 小时
最后登录
2018-4-19

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

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

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

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

x
本帖最后由 东方喵 于 2018-1-3 11:13 编辑

利用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, 下载次数: 185)

评分

参与人数 7鲜花 +71 收起 理由
0度单舞 + 2 赞一个!
kass0615 + 5 很给力!
goonangel + 2 很给力!
kckbkckb2 + 5 很给力!
kusu2008 + 5 很给力!
lixiaobai + 2 很给力!
朱迪 + 50 很给力!

查看全部评分


回复

使用道具 举报

5熟悉之中
630/1000
排名
4602
昨日变化
25

6

主题

101

帖子

630

积分

Rank: 5Rank: 5

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

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

回复

使用道具 举报

5熟悉之中
785/1000
排名
4319
昨日变化
3

0

主题

336

帖子

785

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
2019/5000
排名
2210
昨日变化
6

22

主题

1142

帖子

2019

积分

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

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

回复 支持 反对

使用道具 举报

2初来乍到
107/150
排名
20686
昨日变化
25

0

主题

34

帖子

107

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

7日久生情
2239/5000
排名
18479
昨日变化
28

2

主题

1863

帖子

2239

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
569/1000
排名
5742
昨日变化
4

5

主题

196

帖子

569

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
2123/5000
排名
270
昨日变化
3

0

主题

70

帖子

2123

积分

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

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1255/1500
排名
1367
昨日变化
2

2

主题

80

帖子

1255

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

7日久生情
1810/5000
排名
1246
昨日变化

1

主题

563

帖子

1810

积分

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

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

回复 支持 反对

使用道具 举报

4四处流浪
382/500
排名
6868
昨日变化
1

0

主题

73

帖子

382

积分

Rank: 4

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

回复

使用道具 举报

5熟悉之中
994/1000
排名
1847
昨日变化

0

主题

108

帖子

994

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1633/5000
排名
1374
昨日变化

29

主题

373

帖子

1633

积分

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

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

回复 支持 反对

使用道具 举报

4四处流浪
378/500
排名
7102
昨日变化
5

0

主题

75

帖子

378

积分

Rank: 4

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

回复

使用道具 举报

3偶尔光临
280/300
排名
8448
昨日变化

0

主题

105

帖子

280

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

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

本版积分规则

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