MSBuild task for ILRepack which is an open-source alternative to ILMerge.
Install-Package ILRepack.Lib.MSBuild
- MSBuild
You just need to install NuGet package to merge all your project dependencies. If you want to customize the process then you can create a file named "ILRepack.targets" in your project folder. You can create it like shown below.
<!-- ILRepack -->
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="ILRepacker" AfterTargets="Build" Condition="'$(Configuration)' == 'Release'">
<ItemGroup>
<InputAssemblies Include="$(OutputPath)\ExampleAssemblyToMerge1.dll" />
<InputAssemblies Include="$(OutputPath)\ExampleAssemblyToMerge2.dll" />
<InputAssemblies Include="$(OutputPath)\ExampleAssemblyToMerge3.dll" />
</ItemGroup>
<ItemGroup>
<!-- Must be a fully qualified name -->
<DoNotInternalizeAssemblies Include="ExampleAssemblyToMerge3" />
</ItemGroup>
<ILRepack
Parallel="true"
Internalize="true"
InternalizeExclude="@(DoNotInternalizeAssemblies)"
InputAssemblies="@(InputAssemblies)"
TargetKind="Dll"
OutputFile="$(OutputPath)\$(AssemblyName).dll"
/>
</Target>
</Project>
<!-- /ILRepack -->
You need to create "ILRepack.Config.props" file in your project folder to configure the behavior of ILRepack.Lib.MSBuild.Task.
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
</PropertyGroup>
</Project>
You can specify following options inside the <PropertyGroup> element to configure the behavior of the ILRepack task.
If you don't want to add "ILRepack.targets" file in your project folder then you can specify your targets file path as shown below.
<ILRepackTargetsFile>$(SolutionDir)ILRepack.targets</ILRepackTargetsFile>
You can specify the path of the SNK file you want to use for signing your assembly as shown below. This configuration option only applies if you are using default targets file provided in NuGet package.
<KeyFile>$(ProjectDir)ILRepack.snk</KeyFile>
If you are using default targets file then you may notice that it clears Output directory after merging dependencies. You can turn this functionality off by setting ClearOutputDirectory to False as shown below.
<ClearOutputDirectory>False</ClearOutputDirectory>
Option | Description |
---|---|
KeyFile | Specifies a KeyFile to sign the output assembly. |
KeyContainer | Specifies a KeyContainer to use. |
LogFile | Specifies a logfile to output log information. |
Union | Merges types with identical names into one. |
DebugInfo | Enable/disable symbol file generation. |
AttributeFile | Take assembly attributes from the given assembly file. |
CopyAttributes | Copy assembly attributes. |
AllowMultiple | Allows multiple attributes (if type allows). |
TargetKind | Target assembly kind (Exe|Dll|WinExe|SameAsPrimaryAssembly). |
TargetPlatformVersion | Target platform (v1, v1.1, v2, v4 supported). |
TargetPlatformDirectory | Path of Directory where target platform is located. |
XmlDocumentation | Merge assembly xml documentation. |
LibraryPath | List of paths to use as "include directories" when attempting to merge assemblies. |
Internalize | Set all types but the ones from the first assembly 'internal'. |
RenameInternalized | Rename all internalized types (to be used when Internalize is enabled). |
InternalizeExclude | Assemblies that will not be internalized. |
OutputFile | Output name for merged assembly. |
InputAssemblies | List of assemblies that will be merged. |
DelaySign | Set the keyfile, but don't sign the assembly. |
AllowDuplicateResources | Allows to duplicate resources in output assembly. |
ZeroPeKind | Allows assemblies with Zero PeKind (but obviously only IL will get merged). |
Parallel | Use as many CPUs as possible to merge the assemblies. |
Verbose | Additional debug information during merge that will be outputted to LogFile. |
Wildcards | Allows (and resolves) file wildcards (e.g. `*`.dll) in input assemblies. |