diff --git a/Editor/Commands/AOTReferenceGeneratorCommand.cs b/Editor/Commands/AOTReferenceGeneratorCommand.cs index e6a1d27..5e85fe9 100644 --- a/Editor/Commands/AOTReferenceGeneratorCommand.cs +++ b/Editor/Commands/AOTReferenceGeneratorCommand.cs @@ -30,17 +30,20 @@ namespace HybridCLR.Editor.Commands var gs = SettingsUtil.GlobalSettings; - var analyzer = new Analyzer(new Analyzer.Options + using (AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget), SettingsUtil.HotUpdateAssemblyNames)) { - MaxIterationCount = Math.Min(20, gs.maxGenericReferenceIteration), - Collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget), SettingsUtil.HotUpdateAssemblyNames), - }); + var analyzer = new Analyzer(new Analyzer.Options + { + MaxIterationCount = Math.Min(20, gs.maxGenericReferenceIteration), + Collector = collector, + }); - analyzer.Run(); + analyzer.Run(); - var writer = new GenericReferenceWriter(); - writer.Write(analyzer.AotGenericTypes.ToList(), analyzer.AotGenericMethods.ToList(), $"{Application.dataPath}/{gs.outputAOTGenericReferenceFile}"); - AssetDatabase.Refresh(); + var writer = new GenericReferenceWriter(); + writer.Write(analyzer.AotGenericTypes.ToList(), analyzer.AotGenericMethods.ToList(), $"{Application.dataPath}/{gs.outputAOTGenericReferenceFile}"); + AssetDatabase.Refresh(); + } } } } diff --git a/Editor/Commands/MethodBridgeGeneratorCommand.cs b/Editor/Commands/MethodBridgeGeneratorCommand.cs index ebafae5..f6e382f 100644 --- a/Editor/Commands/MethodBridgeGeneratorCommand.cs +++ b/Editor/Commands/MethodBridgeGeneratorCommand.cs @@ -72,32 +72,37 @@ namespace HybridCLR.Editor.Commands { CompileDllCommand.CompileDllActiveBuildTarget(); } - var analyzer = new Analyzer(new Analyzer.Options - { - MaxIterationCount = Math.Min(20, SettingsUtil.GlobalSettings.maxMethodBridgeGenericIteration), - Collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget), SettingsUtil.HotUpdateAssemblyNames), - }); - analyzer.Run(); - - var generateJobs = new List<(PlatformABI, string)>() + using (AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateBuildTargetAssemblyResolver(EditorUserBuildSettings.activeBuildTarget), SettingsUtil.HotUpdateAssemblyNames)) { - (PlatformABI.Arm64, "MethodBridge_Arm64"), - (PlatformABI.Universal64, "MethodBridge_Universal64"), - (PlatformABI.Universal32, "MethodBridge_Universal32"), - }; - - var tasks = new List(); - foreach (var (platform, stubFile) in generateJobs) - { - string templateCode = GetTemplateCode(platform); - string outputFile = $"{SettingsUtil.MethodBridgeCppDir}/{stubFile}.cpp"; - tasks.Add(Task.Run(() => + var analyzer = new Analyzer(new Analyzer.Options { - GenerateMethodBridgeCppFile(analyzer, platform, templateCode, outputFile); - })); + MaxIterationCount = Math.Min(20, SettingsUtil.GlobalSettings.maxMethodBridgeGenericIteration), + Collector = collector, + }); + + analyzer.Run(); + + var generateJobs = new List<(PlatformABI, string)>() + { + (PlatformABI.Arm64, "MethodBridge_Arm64"), + (PlatformABI.Universal64, "MethodBridge_Universal64"), + (PlatformABI.Universal32, "MethodBridge_Universal32"), + }; + + var tasks = new List(); + foreach (var (platform, stubFile) in generateJobs) + { + string templateCode = GetTemplateCode(platform); + string outputFile = $"{SettingsUtil.MethodBridgeCppDir}/{stubFile}.cpp"; + tasks.Add(Task.Run(() => + { + GenerateMethodBridgeCppFile(analyzer, platform, templateCode, outputFile); + })); + } + Task.WaitAll(tasks.ToArray()); } - Task.WaitAll(tasks.ToArray()); + } } } diff --git a/Editor/Link/Analyzer.cs b/Editor/Link/Analyzer.cs index 6dcf15a..9d416e1 100644 --- a/Editor/Link/Analyzer.cs +++ b/Editor/Link/Analyzer.cs @@ -21,29 +21,32 @@ namespace HybridCLR.Editor.Link public HashSet CollectRefs(List rootAssemblies) { - var assCollector = new AssemblyCache(_resolver); - var rootAssemblyName = new HashSet(); - foreach(var ass in rootAssemblies) + using (var assCollector = new AssemblyCache(_resolver)) { - if (!rootAssemblyName.Add(ass.GetName().Name)) + var rootAssemblyName = new HashSet(); + foreach (var ass in rootAssemblies) { - throw new Exception($"assembly:{ass.GetName().Name} 重复"); - } - } - - var typeRefs = new HashSet(TypeEqualityComparer.Instance); - foreach (var rootAss in rootAssemblies) - { - var dnAss = assCollector.LoadModule(rootAss.GetName().Name); - foreach(var type in dnAss.GetTypeRefs()) - { - if (!rootAssemblyName.Contains(type.DefinitionAssembly.Name)) + if (!rootAssemblyName.Add(ass.GetName().Name)) { - typeRefs.Add(type); + throw new Exception($"assembly:{ass.GetName().Name} 重复"); } } + + var typeRefs = new HashSet(TypeEqualityComparer.Instance); + foreach (var rootAss in rootAssemblies) + { + var dnAss = assCollector.LoadModule(rootAss.GetName().Name); + foreach (var type in dnAss.GetTypeRefs()) + { + if (!rootAssemblyName.Contains(type.DefinitionAssembly.Name)) + { + typeRefs.Add(type); + } + } + } + assCollector.Dispose(); + return typeRefs; } - return typeRefs; } } } diff --git a/Editor/Meta/AssemblyCache.cs b/Editor/Meta/AssemblyCache.cs index 90c1267..646f966 100644 --- a/Editor/Meta/AssemblyCache.cs +++ b/Editor/Meta/AssemblyCache.cs @@ -9,11 +9,12 @@ using UnityEngine; namespace HybridCLR.Editor.Meta { - public class AssemblyCache + public class AssemblyCache : IDisposable { private readonly IAssemblyResolver _assemblyPathResolver; private readonly ModuleContext _modCtx; private readonly AssemblyResolver _asmResolver; + private bool disposedValue; public Dictionary LoadedModules { get; } = new Dictionary(); @@ -51,5 +52,26 @@ namespace HybridCLR.Editor.Meta return mod; } + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + foreach(var mod in LoadedModules.Values) + { + mod.Dispose(); + } + LoadedModules.Clear(); + } + disposedValue = true; + } + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } } } diff --git a/Editor/Meta/AssemblyReferenceDeepCollector.cs b/Editor/Meta/AssemblyReferenceDeepCollector.cs index 6e69657..39f0f61 100644 --- a/Editor/Meta/AssemblyReferenceDeepCollector.cs +++ b/Editor/Meta/AssemblyReferenceDeepCollector.cs @@ -9,13 +9,14 @@ using UnityEngine; namespace HybridCLR.Editor.Meta { - public class AssemblyReferenceDeepCollector + public class AssemblyReferenceDeepCollector : IDisposable { private readonly IAssemblyResolver _assemblyPathResolver; private readonly List _rootAssemblies; private readonly ModuleContext _modCtx; private readonly AssemblyResolver _asmResolver; + private bool disposedValue; public Dictionary LoadedModules { get; } = new Dictionary(); @@ -78,5 +79,26 @@ namespace HybridCLR.Editor.Meta return mod; } + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + foreach(var mod in LoadedModules.Values) + { + mod.Dispose(); + } + } + LoadedModules.Clear(); + disposedValue = true; + } + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } } } diff --git a/package.json b/package.json index 94d26e7..b4bd2ba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.focus-creative-games.hybridclr_unity", - "version": "0.2.1", + "version": "0.3.0", "displayName": "HybridCLR", "description": "Unity package for HybridCLR. It includes editor and runtime scripts and assets for HybridCLR", "category": "Runtime",