Before today I’ve heard of IlMerge tool. This allows you to bundle all your small
.dll files into one. So if you deploy stand-alone applications, you only have to give a single file to your users. Today I decided to give it a go. And I was disappointed -( error messages were endless. IlMerge did not like this or that or some other assembly.
I quickly looked around and found Costura.Fody package that did exactly what I needed, only I did not have to do any work. All you need to do is install nuget package:
And you are done. No, really. Build your project and check out the output. You’ll see a bunch of dll files as before. This is because input files are not deleted automatically. But if you check your executable – it is much larger now. And you can move it away from the rest of libraries files and it will work.
There are some settings available. Check the details on https://github.com/Fody/Costura.
Package installation will create
FodyWeavers.xml file in the root of your solution – put your settings there. I needed to exclude debug symbols from the resulting file. Here is how my
FodyWeavers.xml look like:
<?xml version="1.0" encoding="utf-8" ?>
<Costura IncludeDebugSymbols='false' />
Also I did not care about “minifying” the libraries into one file when I built the debug, but I needed it for Release build. So in my
.csproj file, at the very end I have this:
<Import Project="Fody.targets" Condition=" '$(Configuration)' == 'Release' " />
<!-- Below is the clean-up - removing the input dll files-->
<Target AfterTargets="AfterBuild;NonWinFodyTarget" Name="CleanReferenceCopyLocalPaths" Condition=" '$(Configuration)' == 'Release' ">
<Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />
By default the package only adds one line:
<Import Project="Fody.targets" />
And usually this is good enough. But I’ve added checking for build type and also my OCD required to produce a clean output folder. All this is explained on the GitHub page, on the very bottom.
Overall, very nice package! It just works.