using System; using System.Collections.Generic; using System.Reflection; using System.Threading; static class ILTemplate { static readonly object nullCacheLock = new object(); static readonly Dictionary nullCache = new Dictionary(); static readonly Dictionary assemblyNames = new Dictionary(); static readonly Dictionary symbolNames = new Dictionary(); 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; } }