BetterDiscordApp-v1/Installers/dotNet2/BetterDiscordWI/obj/Release/ILTemplate.cs

63 lines
1.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
static class ILTemplate
{
static readonly object nullCacheLock = new object();
static readonly Dictionary<string, bool> nullCache = new Dictionary<string, bool>();
static readonly Dictionary<string, string> assemblyNames = new Dictionary<string, string>();
static readonly Dictionary<string, string> symbolNames = new Dictionary<string, string>();
static int isAttached = 0;
public static void Attach()
{
if (Interlocked.Exchange(ref isAttached, 1) == 1)
{
return;
}
var currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += ResolveAssembly;
}
public static Assembly ResolveAssembly(object sender, ResolveEventArgs e)
{
lock (nullCacheLock)
{
if (nullCache.ContainsKey(e.Name))
{
return null;
}
}
var requestedAssemblyName = new AssemblyName(e.Name);
var assembly = Common.ReadExistingAssembly(requestedAssemblyName);
if (assembly != null)
{
return assembly;
}
Common.Log("Loading assembly '{0}' into the AppDomain", requestedAssemblyName);
assembly = Common.ReadFromEmbeddedResources(assemblyNames, symbolNames, requestedAssemblyName);
if (assembly == null)
{
lock (nullCacheLock)
{
nullCache[e.Name] = true;
}
// Handles retargeted assemblies like PCL
if (requestedAssemblyName.Flags == AssemblyNameFlags.Retargetable)
{
assembly = Assembly.Load(requestedAssemblyName);
}
}
return assembly;
}
}