2022-02-10 ILRunTime

相关资料 :
总之记住一次句 :
使用ILRuntime要听话,听官方手册的话。最最最重要就是,按部就班,不要骚、不要骚、不要骚!!!
1 (https://www.cnblogs.com/xiloweiEVE/p/14022939.html)
2官方文档(http://ourpalm.github.io/ILRuntime/public/v1/guide/reflection.html)

3:(https://blog.csdn.net/zymkingk/article/details/120221401?spm=1001.2014.3001.5502)
4相关视频 https://www.bilibili.com/video/BV1wt4y1B7VG?p=1
ILRuntime中 :
引入了CLR重定向机制。 原理就是当IL解译器发现需要调用某个指定CLR方法时,将实际调用重定向到另外一个方法进行挟持,再在这个方法中对ILRuntime的反射的用法进行处理
委托适配器(DelegateAdapter)

在搭建ILRuntime 框架时候 吧逻辑代码和核心代码分离
unity 项目部分 启动代码 + 资源管理 (AB包 ,ResMar,;ILRuntimeWrapper)+其他的管理 (网络管理)
Debug.Log("调用无参数静态方法");
//调用无参数静态方法,appdomain.Invoke("类名", "方法名", 对象引用, 参数列表);
appdomain.Invoke("HotFix_Project.InstanceClass", "StaticFunTest", null, null);
//调用带参数的静态方法
Debug.Log("调用带参数的静态方法");
appdomain.Invoke("HotFix_Project.InstanceClass", "StaticFunTest2", null, 123);

    Debug.Log("通过IMethod调用方法");
    //预先获得IMethod,可以减低每次调用查找方法耗用的时间
    IType type = appdomain.LoadedTypes["HotFix_Project.InstanceClass"];
    //根据方法名称和参数个数获取方法
    IMethod method = type.GetMethod("StaticFunTest2", 1);

ILRuntime热更项目: .net , .dll 输出生成路径 ; 热更项目我们的代码目录结构
在ILRunTime代码调用c#核心代码
1 直接调用就可以了 gameobject里面获取我们的组件实例 gameObjec.GetComponent()
2 你不要继承他
3如果你自己写的代码在我们UNity项目工程里面C#代码 你也是可以直接进行调用的

Hotfix-project -所有的业务逻辑都是基于此功能来开发的

unity+ILRuntime

OutputPath 在编译这个工程的时候最后生成的目录 生成路径

Assembly-CSharp 在unity 中 可以识别在unity中写的代码

appdomain 解释执行的虚拟机

pdb调试 对调用栈 等信息查看 调式数据库

appdomain ILRuntime的装载虚拟机

Unity部分 ILRunTime虚拟机+引擎核心代码 +框架代码 ==》不能做热更新 加载我们的dll; ILRuntime -->解释执行里面的代码
另外一个项目--ILRunTime业务逻辑项目工程 --》.net项目--》-->业务逻辑.dll-->UnityEngine.dll代码
Assemdly -CSharp.dll()

ILRuntime 虚拟空间会很大

场景为空 适合大家去维护 协作 美术策划编译资源的需要 自己创建 场景 资源 视图 地图场景 角色美术 运行时候场景为空 使用代码创建出来
代码new出来 代码加载资源 资源管理 基于Assetsbundle资源管理 不使用Resouces 资源 Ab包 然后放在本地 远程 更新方便 方便热更新 方便大空包 ab包放在SteammingAssets
开发的时候 你的资源变动 你要打ab宝 开发模式 AssetsDataBase模式发布模式 ab包的模式 Resmar --开始模式 发布模式
业务逻辑的代码全部都写到ILruntime的热更新项目里面

LoadHotFixAssembly|() 加载streamingAssets/Hotfix_Project.dll 读取内存中
appdomian.LoadAssembly(HotFix_Project.dll) 将热更dll读取到热更脚步解释器

--自动以委托 默认情况下 框架只支持Action Func委托
appdomian.DelegateManager.RegisterMethodDelegate().
--OnPathDelegate 转化成Action
appodmian.DelegateManager.RegisterDelegateConvertor((act)=>{
return new OnPathDelegate((Path)=>{
((Action)act).Invoke(Path)
});

});

--协成的适配器 热更项目支持协成语法
appdomian .RegisterCrossBindingAdbptor(new CoroutineAdapter())

【ContextMenu("参数")】
开启协成的接口
StartCoroutine()

执行步骤:
LoadHotFixAssmbly()
加载StreamingAsset/HotFix_Project.pdb中
appdomain.LoadAssembly(HotFix_Project.dll)将热更dll读取到热更脚本解释器
初始化 ILRuntime
执行脚本引擎后序加载的逻辑处理

----------------->Deleate
public static TestDelegateMethod TestMethodDelegate;
public static TestDelegateFunction TestFunctionDelegate;
public static System.Action TestActionDelegate;

//这里做一些ILRuntime的注册
//TestDelegateMethod, 这个委托类型为有个参数为int的方法,注册仅需要注册不同的参数搭配即可
appdomain.DelegateManager.RegisterMethodDelegate();
//带返回值的委托的话需要用RegisterFunctionDelegate,返回类型为最后一个
appdomain.DelegateManager.RegisterFunctionDelegate();
//Action 的参数为一个string
appdomain.DelegateManager.RegisterMethodDelegate();

在ILRuntime内部是用Action和Func这两个系统内置的委托类型来创建实例的,所以其他的委托类型都需要写转换器
//将Action或者Func转换成目标委托类型
也就是说将我们所注册的委托类型通过转换器把Action或者Func转换成正确的类型 (=>)
同理我们对Func进行转换的话也是通过 System.Func<"参数类型”>
在Unity 转化ILRuntime中 对于UGUI来说的委托方式 UnityEngine.Events.UnityAction ((a))=>{
(System.Actionaction)(a)
}

你可能感兴趣的:(2022-02-10 ILRunTime)