123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- using dnlib.DotNet;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using System.Threading.Tasks;
- using UnityEngine;
- namespace HybridCLR.Editor.Meta
- {
- public class AssemblyCache : IDisposable
- {
- private readonly IAssemblyResolver _assemblyPathResolver;
- private readonly ModuleContext _modCtx;
- private readonly AssemblyResolver _asmResolver;
- private bool disposedValue;
- public Dictionary<string, ModuleDefMD> LoadedModules { get; } = new Dictionary<string, ModuleDefMD>();
- public AssemblyCache(IAssemblyResolver assemblyResolver)
- {
- _assemblyPathResolver = assemblyResolver;
- _modCtx = ModuleDef.CreateModuleContext();
- _asmResolver = (AssemblyResolver)_modCtx.AssemblyResolver;
- _asmResolver.EnableTypeDefCache = true;
- _asmResolver.UseGAC = false;
- }
- public ModuleDefMD LoadModule(string moduleName, bool loadReferenceAssemblies = true)
- {
- // Debug.Log($"load module:{moduleName}");
- if (LoadedModules.TryGetValue(moduleName, out var mod))
- {
- return mod;
- }
- mod = DoLoadModule(_assemblyPathResolver.ResolveAssembly(moduleName, true));
- LoadedModules.Add(moduleName, mod);
- if (loadReferenceAssemblies)
- {
- foreach (var refAsm in mod.GetAssemblyRefs())
- {
- LoadModule(refAsm.Name);
- }
- }
- return mod;
- }
- private ModuleDefMD DoLoadModule(string dllPath)
- {
- //Debug.Log($"do load module:{dllPath}");
- ModuleDefMD mod = ModuleDefMD.Load(dllPath, _modCtx);
- _asmResolver.AddToCache(mod);
- 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);
- }
- }
- }
|