Files
dungeons/Assets/Plugins/Zenject/OptionalExtras/ReflectionBaking/Unity/UnityAssemblyResolver.cs

105 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using Zenject.ReflectionBaking.Mono.Cecil;
namespace Zenject.ReflectionBaking
{
public class UnityAssemblyResolver : BaseAssemblyResolver
{
readonly IDictionary<string, string> _appDomainAssemblyLocations;
readonly IDictionary<string, AssemblyDefinition> _cache;
public UnityAssemblyResolver()
{
_appDomainAssemblyLocations = new Dictionary<string, string>();
_cache = new Dictionary<string, AssemblyDefinition>();
AppDomain domain = AppDomain.CurrentDomain;
Assembly[] assemblies = domain.GetAssemblies();
for (int i = 0; i < assemblies.Length; i++)
{
#if NET_4_6
if (assemblies[i].IsDynamic)
{
continue;
}
#endif
_appDomainAssemblyLocations[assemblies[i].FullName] = assemblies[i].Location;
AddSearchDirectory(Path.GetDirectoryName(assemblies[i].Location));
}
}
public override AssemblyDefinition Resolve(AssemblyNameReference name)
{
AssemblyDefinition assemblyDef = FindAssemblyDefinition(name.FullName, null);
if (assemblyDef == null)
{
assemblyDef = base.Resolve(name);
_cache[name.FullName] = assemblyDef;
}
return assemblyDef;
}
public override AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters)
{
AssemblyDefinition assemblyDef = FindAssemblyDefinition(name.FullName, parameters);
if (assemblyDef == null)
{
assemblyDef = base.Resolve(name, parameters);
_cache[name.FullName] = assemblyDef;
}
return assemblyDef;
}
/// Searches for AssemblyDefinition in our cache, and failing that,
/// looks for a known location. Returns null if both attempts fail.
AssemblyDefinition FindAssemblyDefinition(string fullName, ReaderParameters parameters)
{
if (fullName == null)
{
throw new ArgumentNullException("fullName");
}
AssemblyDefinition assemblyDefinition;
// Look in cache first
if (_cache.TryGetValue(fullName, out assemblyDefinition))
{
return assemblyDefinition;
}
// Try to use known location
string location;
if (_appDomainAssemblyLocations.TryGetValue(fullName, out location))
{
if (parameters != null)
{
assemblyDefinition = AssemblyDefinition.ReadAssembly(location, parameters);
}
else
{
assemblyDefinition = AssemblyDefinition.ReadAssembly(location);
}
_cache[fullName] = assemblyDefinition;
return assemblyDefinition;
}
return null;
}
}
}