2.环境搭建和开发方式
2.1 知识点
ILRuntime环境搭建
修改工程文件夹下Packages文件夹中的manifest.json文件 Packages文件夹和Asset文件夹同级
- 在dependencies字段前加上:
"scopedRegistries": [ { "name": "ILRuntime", "url": "https://registry.npmjs.org", "scopes": [ "com.ourpalm" ] } ],
- 或者在PrejectSetting中的Package Manager添加对应信息
- Name: ILRuntime
- Url: https://registry.npmjs.org
- Scopes: com.ourpalm
- 在dependencies字段前加上:
在Unity工具栏中的Window中打开Package Manager
- 左上角的Packages选择My Registries选项
- 选择其中的ILRuntime并安装
- 安装完成后再导入其示例工程,点击下方Sample按钮
这时会出现报错,因为ILRuntime中会用到C#中的unsafe关键字
- 我们需要在工具栏的Edit中选择ProjectSettings
- 在Other Setting 中勾选 Allow ‘unsafe’ Code 的选项
执行完上述操作后,可以在工具栏看到ILRuntime的选项
ILRuntime的开发方式
通过导入ILRuntime的工具后
- 我们可以在工程目录下的Samples\ILRuntime\2.1.0\Demo文件夹中看到一个HotFix_Project的文件夹,该文件夹在编辑器中无法看到,需要在资源管理器中查看
- 该工程就是我们的热更工程
- 所有需要热更新的代码都会放到这个工程里,和Unity工程是不一样的
- 热更工程主要用来生成dll包,在Unity中看不到是因为在文件夹最后加了一个
,只要结尾为的文件夹在Unity中都看不到 - 通过HotFix_Project.sln打开热更工程,里面是一些示例代码
ILRuntime的开发方式分成了两个部分
- 直接在Unity工程中进行非热更部分的开发(和以前写C#一样)
- 在热更工程中开发需要热更新的部分(同样使用C#)
- 导入ILRuntime过后我们需要在两个工程之间切换开发
- 两个工程之间可以相互访问调用,这就是在开发ILRuntime热更项目时的工作方式
什么是ILRuntime中的跨域访问
- ILRuntime中的跨域访问就是指在原始的Unity工程之间和热更工程之间的相互访问调用
- 在Unity工程中使用热更工程中声明的内容(类、委托、函数等)
- 在热更工程中使用Unity工程中声明的内容(类、委托、函数等)
执行我们的第一个ILRuntime热更程序
- 通过文件浏览器打开HotFix_Project工程,右键点击重新生成,如果报错,请修改工程的目标框架为4.8或者更高
- 生成成功后,可以在Unity工程的StreamingAssets文件夹中看到HotFix_Project的两个文件,一个是dll文件(代码库文件)、一个是pdb文件(调试相关信息文件)。因为在热更工程写好了生成路径
- 打开Assets\Samples\ILRuntime\2.1.0\Demo_Scenes\Examples路径下的示例工程HelloWorld,运行。成功后可以在Console窗口看到打印信息,能正常打印就行。
ILRuntime的基本原理
关键点
- Mono.Cecil库
- 一个专门用于读取C#编译的DLL的开源第三方库
- 可以获取到
- DLL中的类型和方法原信息
- 读取方法体的IL汇编指令
- 可以读取PDB调试符号表文件
- 可以修改DLL中的元信息和方法体内容并写回DLL
- Mono.Cecil库
ILRuntime通过该库,在运行时通过读取解译DLL文件中的内容来执行我们热更的代码
总结
- 想要正常使用ILRuntime的注意事项:
- 修改manifest.json文件中的配置
- Allow ‘unsafe’ Code 选项
- 通过HotFix_Project工程生成用于热更的dll和pdb文件
- ILRuntime的基本原理就是利用Mono.Cecil库去解释执行热更工程中DLL中的代码
2.2 练习题
按照知识点进行ILRuntime环境搭建,并运行01_HelloWorld场景让其打印成功
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com