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

扫一扫,访问微社区

开发者专栏

关注:1963

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

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

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

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

  [复制链接]  [移动端链接]
排名
982
昨日变化
3

31

主题

788

帖子

3012

积分

Rank: 9Rank: 9Rank: 9

UID
76248
好友
19
蛮牛币
17084
威望
0
注册时间
2015-2-28
在线时间
793 小时
最后登录
2017-11-17

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

发表于 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, 下载次数: 162)

评分

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

查看全部评分


回复

使用道具 举报

5熟悉之中
587/1000
排名
4407
昨日变化
3

5

主题

95

帖子

587

积分

Rank: 5Rank: 5

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

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

回复

使用道具 举报

5熟悉之中
785/1000
排名
3962
昨日变化
4

0

主题

339

帖子

785

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1800/5000
排名
2428
昨日变化
2

22

主题

1047

帖子

1800

积分

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

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

回复 支持 反对

使用道具 举报

2初来乍到
105/150
排名
19077
昨日变化
18

0

主题

34

帖子

105

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

7日久生情
2003/5000
排名
17647
昨日变化
10

2

主题

1675

帖子

2003

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
566/1000
排名
5280
昨日变化
4

5

主题

199

帖子

566

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1864/5000
排名
295
昨日变化

0

主题

60

帖子

1864

积分

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

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1223/1500
排名
1206
昨日变化

2

主题

78

帖子

1223

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

6蛮牛粉丝
1491/1500
排名
1421
昨日变化
7

1

主题

457

帖子

1491

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

4四处流浪
367/500
排名
6558
昨日变化
7

0

主题

73

帖子

367

积分

Rank: 4

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

回复

使用道具 举报

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

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 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1398/1500
排名
1552
昨日变化
1

27

主题

331

帖子

1398

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

4四处流浪
370/500
排名
6626
昨日变化
7

0

主题

74

帖子

370

积分

Rank: 4

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

回复

使用道具 举报

3偶尔光临
271/300
排名
8067
昨日变化
7

0

主题

103

帖子

271

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

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

本版积分规则

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