using System.Collections.Generic;
using Mono.Cecil;
namespace StardewModdingAPI.Framework.ModLoading
{
/// A minimal assembly definition resolver which resolves references to known assemblies.
internal class AssemblyDefinitionResolver : DefaultAssemblyResolver
{
/*********
** Properties
*********/
/// The known assemblies.
private readonly IDictionary Loaded = new Dictionary();
/*********
** Public methods
*********/
/// Add known assemblies to the resolver.
/// The known assemblies.
public void Add(params AssemblyDefinition[] assemblies)
{
foreach (AssemblyDefinition assembly in assemblies)
{
this.Loaded[assembly.Name.Name] = assembly;
this.Loaded[assembly.Name.FullName] = assembly;
}
}
/// Resolve an assembly reference.
/// The assembly name.
public override AssemblyDefinition Resolve(AssemblyNameReference name) => this.ResolveName(name.Name) ?? base.Resolve(name);
/// Resolve an assembly reference.
/// The assembly name.
/// The assembly reader parameters.
public override AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) => this.ResolveName(name.Name) ?? base.Resolve(name, parameters);
/// Resolve an assembly reference.
/// The assembly full name (including version, etc).
public override AssemblyDefinition Resolve(string fullName) => this.ResolveName(fullName) ?? base.Resolve(fullName);
/// Resolve an assembly reference.
/// The assembly full name (including version, etc).
/// The assembly reader parameters.
public override AssemblyDefinition Resolve(string fullName, ReaderParameters parameters) => this.ResolveName(fullName) ?? base.Resolve(fullName, parameters);
/*********
** Private methods
*********/
/// Resolve a known assembly definition based on its short or full name.
/// The assembly's short or full name.
private AssemblyDefinition ResolveName(string name)
{
return this.Loaded.ContainsKey(name)
? this.Loaded[name]
: null;
}
}
}