123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- using HybridCLR.Generators;
- using HybridCLR.Generators.MethodBridge;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using System.Threading.Tasks;
- using UnityEditor;
- using UnityEngine;
- namespace HybridCLR
- {
- internal class MethodBridgeHelper
- {
- private static void CleanIl2CppBuildCache()
- {
- string il2cppBuildCachePath = BuildConfig.Il2CppBuildCacheDir;
- if (!Directory.Exists(il2cppBuildCachePath))
- {
- return;
- }
- Debug.Log($"clean il2cpp build cache:{il2cppBuildCachePath}");
- Directory.Delete(il2cppBuildCachePath, true);
- }
- private static List<Assembly> CollectDependentAssemblies(Dictionary<string, Assembly> allAssByName, List<Assembly> dlls)
- {
- for(int i = 0; i < dlls.Count; i++)
- {
- Assembly ass = dlls[i];
- foreach (var depAssName in ass.GetReferencedAssemblies())
- {
- if (!allAssByName.ContainsKey(depAssName.Name))
- {
- Debug.Log($"ignore ref assembly:{depAssName.Name}");
- continue;
- }
- Assembly depAss = allAssByName[depAssName.Name];
- if (!dlls.Contains(depAss))
- {
- dlls.Add(depAss);
- }
- }
- }
- return dlls;
- }
- private static List<Assembly> GetScanAssembiles()
- {
- var allAssByName = new Dictionary<string, Assembly>();
- foreach(var ass in AppDomain.CurrentDomain.GetAssemblies())
- {
- allAssByName[ass.GetName().Name] = ass;
- }
- //CompileDllHelper.CompileDllActiveBuildTarget();
- var rootAssemblies = BuildConfig.AllHotUpdateDllNames
- .Select(dll => Path.GetFileNameWithoutExtension(dll)).Concat(GeneratorConfig.GetExtraAssembiles())
- .Where(name => allAssByName.ContainsKey(name)).Select(name => allAssByName[name]).ToList();
- //var rootAssemblies = GeneratorConfig.GetExtraAssembiles()
- // .Where(name => allAssByName.ContainsKey(name)).Select(name => allAssByName[name]).ToList();
- CollectDependentAssemblies(allAssByName, rootAssemblies);
- rootAssemblies.Sort((a, b) => a.GetName().Name.CompareTo(b.GetName().Name));
- Debug.Log($"assembly count:{rootAssemblies.Count}");
- foreach(var ass in rootAssemblies)
- {
- Debug.Log($"scan assembly:{ass.GetName().Name}");
- }
- return rootAssemblies;
- }
- private static void GenerateMethodBridgeCppFile(PlatformABI platform, string fileName)
- {
- string outputFile = $"{BuildConfig.MethodBridgeCppDir}/{fileName}.cpp";
- var g = new MethodBridgeGenerator(new MethodBridgeGeneratorOptions()
- {
- CallConvention = platform,
- Assemblies = GetScanAssembiles(),
- OutputFile = outputFile,
- });
- g.PrepareMethods();
- g.Generate();
- Debug.LogFormat("== output:{0} ==", outputFile);
- CleanIl2CppBuildCache();
- }
- [MenuItem("HybridCLR/MethodBridge/Arm64")]
- public static void MethodBridge_Arm64()
- {
- GenerateMethodBridgeCppFile(PlatformABI.Arm64, "MethodBridge_Arm64");
- }
- [MenuItem("HybridCLR/MethodBridge/Universal64")]
- public static void MethodBridge_Universal64()
- {
- GenerateMethodBridgeCppFile(PlatformABI.Universal64, "MethodBridge_Universal64");
- }
- [MenuItem("HybridCLR/MethodBridge/Universal32")]
- public static void MethodBridge_Universal32()
- {
- GenerateMethodBridgeCppFile(PlatformABI.Universal32, "MethodBridge_Universal32");
- }
- [MenuItem("HybridCLR/MethodBridge/All")]
- public static void MethodBridge_All()
- {
- GenerateMethodBridgeCppFile(PlatformABI.Arm64, "MethodBridge_Arm64");
- GenerateMethodBridgeCppFile(PlatformABI.Universal64, "MethodBridge_Universal64");
- GenerateMethodBridgeCppFile(PlatformABI.Universal32, "MethodBridge_Universal32");
- }
- }
- }
|