/// <summary> /// 分析dll生成 /// </summary> /// <param name="platform"></param> /// <param name="dllpath"></param> static private void GenCLRBindingByAnalysis(RuntimePlatform platform = RuntimePlatform.Lumin, string dllpath = "") { if (platform == RuntimePlatform.Lumin) { platform = Application.platform; } //默认读StreammingAssets下面path if (dllpath == "") { dllpath = Application.streamingAssetsPath + "/" + BApplication.GetPlatformPath(platform) + DLLPATH; } //不参与自动绑定的 List <Type> excludeTypes = new List <Type>(); // excludeTypes.AddRange(manualBindingTypes); excludeTypes.AddRange(preBindingTypes); //用新的分析热更dll调用引用来生成绑定代码 var outputPath = "Assets/Code/Game/ILRuntime/Binding/Analysis"; ILRuntimeHelper.LoadHotfix(dllpath, false); BindingCodeGenerator.GenerateBindingCode(ILRuntimeHelper.AppDomain, outputPath); ILRuntimeHelper.Close(); /******************移除已经被绑定的部分****************/ var analysisClrBinding = IPath.Combine(outputPath, "CLRBindings.cs"); var manualPath = "Assets/Code/Game/ILRuntime/Binding/Manual"; var prebindingPath = "Assets/Code/Game/ILRuntime/Binding/PreBinding"; //手动绑定的所有文件 var bindingFs = Directory.GetFiles(manualPath, "*.*").ToList(); if (Directory.Exists(prebindingPath)) { bindingFs.AddRange(Directory.GetFiles(prebindingPath, "*.*")); } for (int i = 0; i < bindingFs.Count; i++) { //删除被手动绑定的文件 var f = IPath.Combine(outputPath, Path.GetFileName(bindingFs[i])); if (File.Exists(f)) { File.Delete(f); } // bindingFs[i] = Path.GetFileNameWithoutExtension(bindingFs[i]); } var analysisContent = File.ReadAllLines(analysisClrBinding).ToList(); //修改CLRbingding内容 for (int i = analysisContent.Count - 1; i >= 0; i--) { var line = analysisContent[i]; //移除line foreach (var mf in bindingFs) { if (line.Contains(mf)) { analysisContent.RemoveAt(i); Debug.Log("移除[已经绑定]:" + line); break; } } } //写入 File.WriteAllLines(analysisClrBinding, analysisContent); //Manual AssetDatabase.Refresh(); }
/// <summary> /// 分析dll生成 /// </summary> /// <param name="platform"></param> /// <param name="dllpath"></param> static public void GenCLRBindingByAnalysis(RuntimePlatform platform, string dllpath = "") { if (dllpath == "") { dllpath = Application.streamingAssetsPath; } //路径 dllpath = dllpath + "/" + BApplication.GetPlatformPath(platform) + DLLPATH; //不参与自动绑定的 List <Type> excludeTypes = new List <Type>(); // excludeTypes.AddRange(manualBindingTypes); excludeTypes.AddRange(preBindingTypes); //用新的分析热更dll调用引用来生成绑定代码 var outputPath = "Assets/Code/BDFramework.Game/ILRuntime/Binding/Analysis"; //游戏工程的Bind Action <bool> mainProjectIlrBindAction = null; var type = BDFrameworkEditorEnvironment.Types.FirstOrDefault((t) => t.FullName == "Game.ILRuntime.GameLogicCLRBinding"); if (type != null) { var method = type.GetMethod("Bind", BindingFlags.Public | BindingFlags.Static); Delegate bindDelegate = Delegate.CreateDelegate(typeof(Action <bool>), null, method); mainProjectIlrBindAction = bindDelegate as Action <bool>; } else { Debug.LogError("Not find CLRBinding logic!!!"); } //注册 ILRuntimeHelper.LoadHotfix(dllpath, mainProjectIlrBindAction, false); BindingCodeGenerator.GenerateBindingCode(ILRuntimeHelper.AppDomain, outputPath); ILRuntimeHelper.Close(); /******************移除已经被绑定的部分****************/ var analysisClrBinding = IPath.Combine(outputPath, "CLRBindings.cs"); var manualPath = "Assets/Code/BDFramework.Game/ILRuntime/Binding/Manual"; var prebindingPath = "Assets/Code/BDFramework.Game/ILRuntime/Binding/PreBinding"; //手动绑定的所有文件 var bindingFs = Directory.GetFiles(manualPath, "*.*").ToList(); if (Directory.Exists(prebindingPath)) { bindingFs.AddRange(Directory.GetFiles(prebindingPath, "*.*")); } for (int i = 0; i < bindingFs.Count; i++) { //删除被手动绑定的文件 var f = IPath.Combine(outputPath, Path.GetFileName(bindingFs[i])); if (f != analysisClrBinding && File.Exists(f)) { File.Delete(f); } bindingFs[i] = Path.GetFileNameWithoutExtension(bindingFs[i]); } var analysisContent = File.ReadAllLines(analysisClrBinding).ToList(); //修改CLRbindding内容 for (int i = analysisContent.Count - 1; i >= 0; i--) { var line = analysisContent[i]; //移除line foreach (var mf in bindingFs) { if (line.Contains(mf + ".Register(app);")) { analysisContent.RemoveAt(i); Debug.Log("移除[已经绑定]:" + line); break; } } } //写入 FileHelper.WriteAllLines(analysisClrBinding, analysisContent.ToArray()); AssetDatabase.Refresh(); }
public void Dispose() { ILRuntimeHelper.Close(); }