From 5926b285e321f4a4ef76aa85328fb701d87de6d8 Mon Sep 17 00:00:00 2001 From: walon Date: Mon, 26 Sep 2022 12:12:57 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=20=E7=94=9F=E6=88=90=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=90=8E=E9=87=8A=E6=94=BEdnlib=E7=9B=B8=E5=85=B3=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=EF=BC=8C=E9=81=BF=E5=85=8D=E5=87=BA=E7=8E=B0dll?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=A2=AB=E5=8D=A0=E7=94=A8=E7=9A=84=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/AOTReferenceGeneratorCommand.cs | 19 ++++--- .../Commands/MethodBridgeGeneratorCommand.cs | 49 ++++++++++--------- Editor/Link/Analyzer.cs | 37 +++++++------- Editor/Meta/AssemblyCache.cs | 24 ++++++++- Editor/Meta/AssemblyReferenceDeepCollector.cs | 24 ++++++++- package.json | 2 +- 6 files changed, 105 insertions(+), 50 deletions(-) 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",