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

扫一扫,访问微社区

开发者专栏

关注:1774

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

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

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

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

  [复制链接]  [移动端链接]
排名
1227
昨日变化
4

27

主题

772

帖子

2680

积分

Rank: 9Rank: 9Rank: 9

UID
76248
好友
17
蛮牛币
15960
威望
0
注册时间
2015-2-28
在线时间
695 小时
最后登录
2017-7-27

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

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

评分

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

查看全部评分


回复

使用道具 举报

5熟悉之中
576/1000
排名
4185
昨日变化
2

5

主题

93

帖子

576

积分

Rank: 5Rank: 5

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

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

回复

使用道具 举报

5熟悉之中
706/1000
排名
4162
昨日变化
4

0

主题

310

帖子

706

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

6蛮牛粉丝
1399/1500
排名
3023
昨日变化
8

8

主题

834

帖子

1399

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

2初来乍到
105/150
排名
17621
昨日变化
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 | 显示全部楼层
学到了,之前看的热更新都会提到这个,但是一直不知道怎么实现的

回复 支持 反对

使用道具 举报

7日久生情
1589/5000
排名
16323
昨日变化
14

2

主题

1349

帖子

1589

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
558/1000
排名
4944
昨日变化
7

5

主题

199

帖子

558

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1659/5000
排名
327
昨日变化

0

主题

44

帖子

1659

积分

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

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1134/1500
排名
1239
昨日变化
1

2

主题

71

帖子

1134

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

6蛮牛粉丝
1164/1500
排名
1893
昨日变化
4

1

主题

350

帖子

1164

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

3偶尔光临
218/300
排名
8783
昨日变化
103

0

主题

74

帖子

218

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

5熟悉之中
873/1000
排名
1864
昨日变化
6

0

主题

105

帖子

873

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

6蛮牛粉丝
1185/1500
排名
1851
昨日变化
5

23

主题

291

帖子

1185

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

3偶尔光临
269/300
排名
7807
昨日变化
4

0

主题

61

帖子

269

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

3偶尔光临
269/300
排名
7610
昨日变化
5

0

主题

102

帖子

269

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

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

本版积分规则

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