using HybridCLR.Editor.ABI; using HybridCLR.Editor.Template; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using UnityEngine; namespace HybridCLR.Editor.Il2CppDef { public class Il2CppDefGenerator { public class Options { public List HotUpdateAssemblies { get; set; } public string OutputFile { get; set; } public string OutputFile2 { get; set; } public string UnityVersion { get; set; } } private readonly Options _options; public Il2CppDefGenerator(Options options) { _options = options; } private static readonly Regex s_unityVersionPat = new Regex(@"(\d+)\.(\d+)\.(\d+)"); public void Generate() { GenerateIl2CppConfig(); GeneratePlaceHolderAssemblies(); } private void GenerateIl2CppConfig() { var frr = new FileRegionReplace(File.ReadAllText(_options.OutputFile)); List lines = new List(); var match = s_unityVersionPat.Matches(_options.UnityVersion)[0]; int majorVer = int.Parse(match.Groups[1].Value); int minorVer1 = int.Parse(match.Groups[2].Value); int minorVer2 = int.Parse(match.Groups[3].Value); lines.Add($"#define HYBRIDCLR_UNITY_VERSION {majorVer}{minorVer1.ToString("D2")}{minorVer2.ToString("D2")}"); lines.Add($"#define HYBRIDCLR_UNITY_{majorVer} 1"); for (int ver = 2019; ver <= 2024; ver++) { if (majorVer >= ver) { lines.Add($"#define HYBRIDCLR_UNITY_{ver}_OR_NEW 1"); } } #if TUANJIE_1_1_OR_NEWER var tuanjieMatch = Regex.Matches(Application.tuanjieVersion, @"(\d+)\.(\d+)\.(\d+)"); int tuanjieMajorVer = int.Parse(tuanjieMatch[0].Groups[1].Value); int tuanjieMinorVer1 = int.Parse(tuanjieMatch[0].Groups[2].Value); int tuanjieMinorVer2 = int.Parse(tuanjieMatch[0].Groups[3].Value); lines.Add($"#define HYBRIDCLR_TUANJIE_VERSION {tuanjieMajorVer}{tuanjieMinorVer1.ToString("D2")}{tuanjieMinorVer2.ToString("D2")}"); #elif TUANJIE_2022_3_OR_NEWER lines.Add($"#define HYBRIDCLR_TUANJIE_VERSION 10000"); #endif frr.Replace("UNITY_VERSION", string.Join("\n", lines)); frr.Commit(_options.OutputFile); Debug.Log($"[HybridCLR.Editor.Il2CppDef.Generator] output:{_options.OutputFile}"); } private void GeneratePlaceHolderAssemblies() { var frr = new FileRegionReplace(File.ReadAllText(_options.OutputFile2)); List lines = new List(); foreach (var ass in _options.HotUpdateAssemblies) { lines.Add($"\t\t\"{ass}\","); } frr.Replace("PLACE_HOLDER", string.Join("\n", lines)); frr.Commit(_options.OutputFile2); Debug.Log($"[HybridCLR.Editor.Il2CppDef.Generator] output:{_options.OutputFile2}"); } } }