Skip to content

Instantly share code, notes, and snippets.

@Swizzy
Created November 2, 2013 16:38
Show Gist options
  • Save Swizzy/7280856 to your computer and use it in GitHub Desktop.
Save Swizzy/7280856 to your computer and use it in GitHub Desktop.
A Class for use when embedding assemblies that may have embedded assemblies in them (this will take care of all of it, just run PreLoadAssemblies() once then add CurrentDomainAssemblyResolve to the current domain AssemblyResolve event like so (NOTE: This must be done BEFORE anything is actually running): AppDomain.CurrentDomain.AssemblyResolve +…
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
internal static class EmbeddedAssemblyManager {
private static readonly Dictionary<string, Assembly> Assemblies = new Dictionary<string, Assembly>();
internal static void PreLoadAssemblies() {
Assemblies.Clear();
PreLoadAssemblies(Assembly.GetAssembly(typeof(EmbeddedAssemblyManager)));
var keys = new string[Assemblies.Count];
Assemblies.Keys.CopyTo(keys, 0);
foreach(var key in keys)
PreLoadAssemblies(Assemblies[key]);
}
private static void PreLoadAssemblies(Assembly sourceAssembly) {
foreach(var assemblyname in sourceAssembly.GetManifestResourceNames()) {
Debug.WriteLine(assemblyname);
if(!assemblyname.EndsWith(".dll", StringComparison.CurrentCultureIgnoreCase))
continue;
var ass = LoadEmbeddedAssembly(sourceAssembly, assemblyname);
Assemblies.Add(ass.FullName, ass);
}
}
private static Assembly LoadEmbeddedAssembly(Assembly sourceAssembly, string name) {
using(var stream = sourceAssembly.GetManifestResourceStream(name)) {
if(stream != null) {
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
return Assembly.Load(data);
}
throw new FileNotFoundException(string.Format("Can't find external nor internal {0}!", name));
}
}
internal static Assembly CurrentDomainAssemblyResolve(object sender, ResolveEventArgs args) {
return Assemblies[args.Name];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment