CLR绑定
CLR绑定 — ILRuntime (ourpalm.github.io)
CLR绑定就是将热更dll内一些需要对CLR接口反射才能调用的主工程的方法,转化为ILRuntime自定义的方法,像Xlua也有类似的绑定机制,目的是为了降低反射性能开销和额外的GC Allocate。
在新版的ILRuntime中,会自动分析热更dll中有哪些地方使用到了必须添加绑定的Type,然后生成绑定代码。
需要注意的是,生成绑定代码之前需要注册所有的跨域继承适配器,否则ILRuntime生成绑定代码时无法正确抓取应用
编辑器工具在Assets文件夹内新建ILRuntime文件夹,并在其中新建Editor文件夹,在其中新建ILRuntimeCLRBinding文件
12345678910111213141516171819202122232425using UnityEditor;using ILRuntime.Runtime.CLRBinding;using ILRuntime.Runtime.Enviorment;using System.IO;public class ILRuntimeCLRBi ...
CLR重定向
CLR重定向 — ILRuntime (ourpalm.github.io)
在热更流程中,主工程创建不了热更工程的类,但是如果我们使用Activator.CreateInstance来尝试创建热更工程的类的实例时,会发现是成功的,这是因为ILRuntime在内部实现了CLR重定向
CLR重定向的原理就是:在运行时先找到主工程内对应方法,然后再进行挟持(或者说使用钩子)来改变这个方法实际的调用效果。
123456789101112131415161718public static StackObject* CreateInstance(ILIntepreter intp, StackObject* esp, List<object> mStack, CLRMethod method, bool isNewObj){ //获取泛型参数<T>的实际类型 IType[] genericArguments = method.GenericArguments; if (genericArguments != null && ge ...
ILRuntime跨域继承
跨域继承跨域继承,即是热更工程继承主工程里面的类。
首先在ILRuntimeManager添加一个抽象类
123456789101112public abstract class TestBaseClass{ public virtual void TestVirtual(string str) { Debug.Log("TestBaseClass TestVirtual str=" + str); } public abstract void TestAbstract(int a); public virtual int Value { get { return 0; } }}
然后再在HotFix热更工程里添加TestInheritance新类
123456789101112131415161718using UnityEngine;namespace HotFix{ public class T ...
Unity的SVN工具
在Unity中通过调用SVN的命令行来执行操作
工具代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165using System;using System.Threading;using System.Diagnostics;using UnityEngine;using ...
ILRuntime委托调用
简单委托委托即是一种函数指针。
这里简单委托指的是,将委托的变量声明和注册都放在热更工程内进行。
创建委托委托创建的位置在主工程和热更工程内都可以,我们这里放在主工程内
在ILRuntimeManager内新添加两个委托,放在最外层即可
12public delegate void TestDelegateMethod(int a);public delegate string TestDelegateFunction(int a);
委托变量声明和注册简单委托我们先在热更工程中新建一个类,命名为TestDelegate
123456789101112131415161718192021222324252627282930313233343536373839using UnityEngine;namespace HotFix{ public class TestDelegate { private TestDelegateMethod m_Method;//在热更工程内声明委托 private TestDelegateFun ...
泛型方法调用
调用热更工程里面的泛型方法
修改热更工程在热更工程中添加泛型方法
1234567891011121314151617181920212223242526using UnityEngine;namespace HotFix{ public class TestClass { private int m_Id; public int Id { get { return m_Id; } } public TestClass() { } public TestClass(int id) { m_Id = id;} public static void StaticFuncTest() { Debug.Log("Test"); } public static void StaticFuncTest2(int a) ...
实例化热更代码中的对象
之前都是直接调用静态方法,但是在热更工程内肯定不能全是静态的方法,我们还需要知道如何实例化热更工程里面的类。
修改热更工程123456789101112131415161718192021using UnityEngine;namespace HotFix{ public class TestClass { private int m_Id;//++ public int Id { get { return m_Id; } }//++ public TestClass() { }//++ public TestClass(int id) { m_Id = id;}//++ public static void StaticFuncTest() { Debug.Log("Test"); } public s ...
静态函数调用
含参函数调用回到HotFix工程,添加一个含参的静态函数
1234567891011121314151617using UnityEngine;namespace HotFix{ public class TestClass { public static void StaticFuncTest() { Debug.Log("Test"); } public static void StaticFuncTest2(int a) { Debug.Log("Test param a = " + a); } }}
在之前,我们使用了方法名直接调用了热更代码
1m_AppDomain.Invoke("HotFix.TestClass", "StaticFuncTest", null, nu ...
热更工程测试
安装从零开始 — ILRuntime (ourpalm.github.io)
从Packages/manifest.json里添加信息后,ILRuntime在PackageManager的新的目录里面
准备热更工程首先进入Unity主工程目录(Assets的父目录),在里面新建HotFixProject文件夹
打开Visual Studio,新建一个项目,选择“类库(.Net Framework)”,按照下图设置
框架只要选择.Net Framework 4.6.1以上即可,虽然截图中使用的是4.6.2,实际项目中使用的是4.7.2
进入工程后,将默认生成的Class1类重命名为TestClass
添加引用在“解决方案资源管理器”中右键“引用——添加引用”,点击浏览
这里按照我的Unity编辑器安装目录,定位到几个需要引用的dll,用作参考。
需要引用的dll库
位置
UnityEngine.dll(在Unity2019之后没用了)
“D:\Program FIles\Unity Editor\2021.3.22f1c1\Editor\Data\Manag ...
ILRuntime介绍
基础知识名词解释
域:应用程序的上下文,可以理解为使用热更之后,在游戏中存在两个域,一个是游戏主程序,另一个是热更域。
跨域继承可以简单理解为跨工程,跨dll继承。比如hotFix.dll继承Assembly-CSharp.dll的一些类。
CLR:Unity脚本(C#)的公共运行库,公共运行环境
ILRuntime主要是在这里进行热更,使用一些钩子对一些方法进行修改。最后经过CLR进行处理
Assembly-CSharp.dll:Unity脚本(C#)的编译成的dll,非特殊目录下或程序集定义目录下的脚本都放在这个dll下。安卓下可通过反射获取方法和变量。
在工程文件的Library——ScriptAssemblies目录下可以看到本工程依赖的所有dll库
hotFix.dll: 指热更工程生成的dll,和Unity主工程是两个不同的dll。
这个dll是属于热更工程,可以认为热更的代码工程和Unity的主工程是不一样的。热更时只更新热更工程
但是也可以将ILRuntime像Xlua一样注入到Unity主工程中,这里不做介绍
JIT编译:JIT编译器在程序运行 ...