hybridclr_unity/Editor/Commands/MethodBridgeGeneratorComman...

89 lines
3.1 KiB
C#
Raw Normal View History

2022-09-22 08:56:07 +08:00
using HybridCLR.Editor;
2022-10-17 12:16:18 +08:00
using HybridCLR.Editor.ABI;
2022-09-22 08:56:07 +08:00
using HybridCLR.Editor.Meta;
using HybridCLR.Editor.MethodBridge;
2022-09-22 08:56:07 +08:00
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.Editor.Commands
{
public class MethodBridgeGeneratorCommand
{
public static void CleanIl2CppBuildCache()
{
string il2cppBuildCachePath = SettingsUtil.Il2CppBuildCacheDir;
if (!Directory.Exists(il2cppBuildCachePath))
{
return;
}
Debug.Log($"clean il2cpp build cache:{il2cppBuildCachePath}");
Directory.Delete(il2cppBuildCachePath, true);
}
private static void GenerateMethodBridgeCppFile(Analyzer analyzer, PlatformABI platform, string templateCode, string outputFile)
{
var g = new Generator(new Generator.Options()
{
2022-10-17 12:16:18 +08:00
PlatformABI = platform,
2022-09-22 08:56:07 +08:00
TemplateCode = templateCode,
OutputFile = outputFile,
GenericMethods = analyzer.GenericMethods,
NotGenericMethods = analyzer.NotGenericMethods,
});
g.PrepareMethods();
g.Generate();
Debug.LogFormat("== output:{0} ==", outputFile);
CleanIl2CppBuildCache();
}
2022-09-23 14:26:28 +08:00
[MenuItem("HybridCLR/Generate/MethodBridge", priority = 101)]
2022-09-22 08:56:07 +08:00
public static void GenerateMethodBridge()
{
GenerateMethodBridge(true);
}
public static void GenerateMethodBridge(bool compileDll)
{
// 此处理论会有点问题,打每个平台的时候,都得针对当前平台生成桥接函数
// 但影响不大,先这样吧
if (compileDll)
{
CompileDllCommand.CompileDllActiveBuildTarget();
}
using (AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget), SettingsUtil.HotUpdateAssemblyNames))
2022-09-22 08:56:07 +08:00
{
var analyzer = new Analyzer(new Analyzer.Options
{
2022-10-09 20:53:13 +08:00
MaxIterationCount = Math.Min(20, SettingsUtil.HybridCLRSettings.maxMethodBridgeGenericIteration),
Collector = collector,
});
2022-09-22 08:56:07 +08:00
analyzer.Run();
2022-09-22 08:56:07 +08:00
var tasks = new List<Task>();
string templateCode = File.ReadAllText($"{SettingsUtil.TemplatePathInPackage}/MethodBridgeStub.cpp");
foreach (PlatformABI platform in Enum.GetValues(typeof(PlatformABI)))
2022-09-22 08:56:07 +08:00
{
string outputFile = $"{SettingsUtil.GeneratedCppDir}/MethodBridge_{platform}.cpp";
tasks.Add(Task.Run(() =>
{
GenerateMethodBridgeCppFile(analyzer, platform, templateCode, outputFile);
}));
}
Task.WaitAll(tasks.ToArray());
2022-09-22 08:56:07 +08:00
}
2022-09-22 08:56:07 +08:00
}
}
}