using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using dnlib.DotNet; using HybridCLR.Editor.Meta; using UnityEditor; using UnityEngine; using IAssemblyResolver = HybridCLR.Editor.Meta.IAssemblyResolver; namespace HybridCLR.Editor.Link { public class Analyzer { private readonly IAssemblyResolver _resolver; public Analyzer(IAssemblyResolver resolver) { _resolver = resolver; } public HashSet CollectRefs(List rootAssemblies) { using (var assCollector = new AssemblyCache(_resolver)) { var rootAssemblyNames = new HashSet(rootAssemblies); var typeRefs = new HashSet(TypeEqualityComparer.Instance); foreach (var rootAss in rootAssemblies) { var dnAss = assCollector.LoadModule(rootAss, false); foreach (var type in dnAss.GetTypeRefs()) { if (type.DefinitionAssembly == null) { Debug.LogWarning($"assembly:{dnAss.Name} TypeRef {type.FullName} has no DefinitionAssembly"); continue; } if (!rootAssemblyNames.Contains(type.DefinitionAssembly.Name.ToString())) { typeRefs.Add(type); } } } assCollector.Dispose(); return typeRefs; } } } }