Monday, February 29, 2016

Static link .NET assemblies/DLL

Get ILMerge or ILRepack
or
Jeffrey Richter resource load

For ease of use and if you don't want to modify existing code then use ILMerge. Otherwise use the code reflection method.

Method 1:

Note: ILMerge is not able to merge WPF assemblies.

ilmerge /target:winexe /out:SelfContainedProgram.exe 
        Program.exe ClassLibrary1.dll ClassLibrary2.dll
 

Method 2:

Embed DLLs as resources using Visual Studio, then add code,

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {  
   String resourceName = "AssemblyLoadingAndReflection." +  
      new AssemblyName(args.Name).Name + ".dll";  
   using (var stream = 
      Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {  
      Byte[] assemblyData = new Byte[stream.Length];  
      stream.Read(assemblyData, 0, assemblyData.Length);  
      return Assembly.Load(assemblyData);  
   }  
};  

TIP: make sure registering the callback comes before everything
TIP: make sure the resource name is correct, esp. if its in a folder

There's a lot of information out there, let me know if I missed anything.

References
http://www.codeproject.com/Articles/9364/Merging-NET-assemblies-using-ILMerge
http://www.digitallycreated.net/Blog/61/combining-multiple-assemblies-into-a-single-exe-for-a-wpf-application

No comments:

Post a Comment