ILRuntime使用笔记
如果ILRuntime使用时性能有问题,需要确认以下几点:
1.发包前是否做了自动分析CLR绑定
2.是否注册了值类型绑定
3.热更DLL是否为release模式编译
4.发包前是否关闭了Development build
5.编辑器下是否定义了DISABLE_ILRUNTIME_DEBUG
注意事项
1. 一般嵌套task或者foreach里多次await容易出现代码执行不到
2. struct在ILRuntime里,如果作为类成员变量,性能比class更低
3. 成员变量里的struct不能双层嵌套(值类型在VM里装箱,双层嵌套要两层寻址,目前无法两层寻址)
4. 热更里try catch的话,需要取ex.Data["StackTrace"]和ex.Data["Message"]
5. 热更里的委托不是真的委托类型,没办法通过Delegate.CreateDelegate创建
6. 直接跟内存和操作系统交互的东西都没法在热更里弄,需要在主工程做这种事情
7. ref out关键字谨慎使用,比如传递ref/out 静态变量时会报错
8. 协程无法使用字符串启动,只支持参数为IEnumerator类型的方式启动或停止协程
9. 泛型方法在展开前无法分析生成绑定文件(除非有调用的地方并传递了泛型类型)
10. 多维数组只能用基础类型,可以把多维数组[,]改为数组的数组[][]
11. 如果自定义委托类型是热更里定义的,那就不能传主工程内的方法给它(可以使用Action或者Func来代替自定义的委托)
12. 热更内Attribute暂只支持基础类型参数
建议
1. 在热更代码中不建议继承MonoBehaviour
2. 尽可能避免使用特性(Attribute),反射(Reflection)
ILRuntime不支持Attribute的继承操作
1. 子类不会继承基类的属性标签,所以热更工程中子类也要有标签
2. Attribute自身的继承
调试条件
1. 安装ILRuntime的VS调试插件(Github上可下载)
2. 确定启用DEBUG宏和禁用DISABLE_ILRUNTIME_DEBUG宏
3. 检查ILRDomain.DebugService.StartDebugService(56000)是否启用
4. 检查PDB是否被加载
5. 检查DLL是否为DEBUG版本(提高调试准确性)
以上条件满足还可以支持真机调试
调试过程
1. 运行Unity编辑器工程并保证ILRDomain.DebugService.StartDebugService(56000)被调用
2. 在VS热更工程中 点击菜单栏 --> 调试 --> Attach to ILRuntime(注意使用一样的端口)
3. 如果调试失败,请检查端口是否有效,是否被防火墙屏蔽
参考:https://blog.csdn.net/Chen_Fen/article/details/115668780