安装ILRuntime插件,导入Unity3D。 创建一个热更新脚本,继承ILRuntime.Runtime.CLRBinding.BindingCodeGenerator,并实现GenerateBindingCode方法。 在Unity3D中,通过菜单栏的Tools->ILRuntime->Generate CLR Binding Code生成绑定代码。 代码实现 以下是一个简单的例子,演示如何使用ILRuntime进行热更新及接口绑定。 创建热...
ILRuntime.Reflection.CLRType type = appDomain.GetType("Namespace.MyServiceImpl"); if (type != null) { appDomain.BindCLRTypeToCLRType(typeof(IMyService), type.CLRType); } // 获取接口实例并调用方法 var instance = appDomain.Instantiate("Namespace.MyServiceImpl"); IMyService service = instance...
CLR函数绑定(CLRBinding) 前面也提到了,因为是c#实现的解释器,其性能受到解释器本生和高级语言的影响。必然会导致性能看不下去。 因此,性能优化被提上日程。那么CLRBinding就出现了。 通过对对应方法的绑定让其调用原生方法的方式。来优化其性能。 这边抄一下官方Debug.Log的示例: // 获取UnityEngine.Debug.Log的反射...
1.发包前是否做了自动分析CLR绑定 2.是否注册了值类型绑定 3.热更DLL是否为release模式编译 4.发包前是否关闭了Development build 5.编辑器下是否定义了DISABLE_ILRUNTIME_DEBUG 注意事项 1. 一般嵌套task或者foreach里多次await容易出现代码执行不到 2. struct在ILRuntime里,如果作为类成员变量,性能比class更低 3...
首先,我们需要编写C#代码。ILRuntime支持大部分C#语法,但是由于它是通过IL解释器执行代码的,因此有些语法会有一些限制,例如不支持反射等。 2.编译C#代码 将编写好的C#代码编译成IL代码。ILRuntime提供了一个工具ILRuntimeCLRBinding,可以将C#代码编译成IL代码,并生成一个绑定文件。绑定文件是一个XML文件,用于记录C#...
将编写好的C#代码编译成IL代码。ILRuntime提供了一个工具ILRuntimeCLRBinding,可以将C#代码编译成IL代码,并生成一个绑定文件。绑定文件是一个XML文件,用于记录C#类型和IL类型之间的映射关系。 3.将IL代码打包到游戏中 将编译好的IL代码打包到游戏中,ILRuntime会在游戏启动时加载IL代码,并将其解释执行。
为什么需要clr绑定? 两个作用:防止热更层用到的框架层代码被裁减, 以及 加速热更代码的执行。为什么会被裁减呢?因为Unity打包的时候真的不把这个热更dll看做dll,因为这个热更dll是脱离unity框架层的。自然在unity打包的时候,为了包体大小会把认为没有使用的代码全部过滤掉。这种情况下ILRuntime解释执行的时候,去反...
首先,我们需要编写C#代码。ILRuntime支持大部分C#语法,但是由于它是通过IL解释器执行代码的,因此有些语法会有一些限制,例如不支持反射等。 2.编译C#代码 将编写好的C#代码编译成IL代码。ILRuntime提供了一个工具ILRuntimeCLRBinding,可以将C#代码编译成IL代码,并生成一个绑定文件。绑定文件是一个XML文件,用于记录C#...
ILRuntimeCLRBinding 用于生成CLR绑定脚本 获取热更程序集,调用ILHelper.InitILRuntime(domain);对程序集进行适配器注册 调用ILRuntime.Runtime.CLRBinding.BindingCodeGenerator.GenerateBindingCode(domain, "Assets/Model/ILBinding");来生成CLR绑定脚本,到指定目录下 ...
("ILRuntime/Generate CLR Binding Code by Analysis")] static void GenerateCLRBindingByAnalysis() { //用新的分析热更dll调用引用来生成绑定代码 ILRuntime.Runtime.Enviorment.AppDomain domain = new ILRuntime.Runtime.Enviorment.AppDomain(); using (System.IO.FileStream fs = new System.IO.FileStream...