2022-09-22 08:56:07 +08:00
|
|
|
|
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 IAssemblyResolver = HybridCLR.Editor.Meta.IAssemblyResolver;
|
|
|
|
|
|
2022-09-23 09:40:06 +08:00
|
|
|
|
namespace HybridCLR.Editor.Link
|
2022-09-22 08:56:07 +08:00
|
|
|
|
{
|
2022-09-23 09:40:06 +08:00
|
|
|
|
public class Analyzer
|
2022-09-22 08:56:07 +08:00
|
|
|
|
{
|
|
|
|
|
private readonly IAssemblyResolver _resolver;
|
|
|
|
|
|
|
|
|
|
public Analyzer(IAssemblyResolver resolver)
|
|
|
|
|
{
|
|
|
|
|
_resolver = resolver;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public HashSet<TypeRef> CollectRefs(List<Assembly> rootAssemblies)
|
|
|
|
|
{
|
2022-09-26 12:12:57 +08:00
|
|
|
|
using (var assCollector = new AssemblyCache(_resolver))
|
2022-09-22 08:56:07 +08:00
|
|
|
|
{
|
2022-09-26 12:12:57 +08:00
|
|
|
|
var rootAssemblyName = new HashSet<string>();
|
|
|
|
|
foreach (var ass in rootAssemblies)
|
2022-09-22 08:56:07 +08:00
|
|
|
|
{
|
2022-09-26 12:12:57 +08:00
|
|
|
|
if (!rootAssemblyName.Add(ass.GetName().Name))
|
|
|
|
|
{
|
|
|
|
|
throw new Exception($"assembly:{ass.GetName().Name} 重复");
|
|
|
|
|
}
|
2022-09-22 08:56:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-09-26 12:12:57 +08:00
|
|
|
|
var typeRefs = new HashSet<TypeRef>(TypeEqualityComparer.Instance);
|
|
|
|
|
foreach (var rootAss in rootAssemblies)
|
2022-09-22 08:56:07 +08:00
|
|
|
|
{
|
2022-09-26 12:12:57 +08:00
|
|
|
|
var dnAss = assCollector.LoadModule(rootAss.GetName().Name);
|
|
|
|
|
foreach (var type in dnAss.GetTypeRefs())
|
2022-09-22 08:56:07 +08:00
|
|
|
|
{
|
2022-09-26 12:12:57 +08:00
|
|
|
|
if (!rootAssemblyName.Contains(type.DefinitionAssembly.Name))
|
|
|
|
|
{
|
|
|
|
|
typeRefs.Add(type);
|
|
|
|
|
}
|
2022-09-22 08:56:07 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-09-26 12:12:57 +08:00
|
|
|
|
assCollector.Dispose();
|
|
|
|
|
return typeRefs;
|
2022-09-22 08:56:07 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|