Created
November 2, 2013 16:38
-
-
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 +…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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