 
ILRepack is meant at replacing ILMerge / Mono.Merge.
The former being closed-source, impossible to customize, slow, resource consuming and many more. The later being deprecated, unsupported, and based on an old version of Mono.Cecil.
Here we're using latest (slightly modified) Cecil sources (0.9), you can find the fork here. Mono.Posix is also required (build only, it gets merged afterwards) for executable bit set on target file.
You can grab it using NuGet.
Or if you're old-school (and want to stay like that), this direct link will give you the latest nupkg file, which you can open as a zip file.
A console application has been released (can be used as DLL as well), using same syntax as ILMerge:
Syntax: ILRepack.exe [options] /out:<path> <path_to_primary> [<other_assemblies> ...]
- /help displays this usage
- /keyfile:<path> specifies a keyfile to sign the output assembly
- /log:<logfile> enable logging (to a file, if given) (default is disabled)
- /ver:M.X.Y.Z target assembly version
- /union merges types with identical names into one
- /ndebug disables symbol file generation
- /copyattrs copy assembly attributes (by default only the primary assembly attributes are copied)
- /attr:<path> take assembly attributes from the given assembly file
- /allowMultiple when copyattrs is specified, allows multiple attributes (if type allows)
- /target:kind specify target assembly kind (library, exe, winexe supported, default is same as first assembly)
- /targetplatform:P specify target platform (v1, v1.1, v2, v4 supported)
- /xmldocs merges XML documentation as well
- /lib:<path> adds the path to the search directories for referenced assemblies (can be specified multiple times)
- /internalize sets all types but the ones from the first assembly 'internal'
- /delaysign sets the key, but don't sign the assembly
- /usefullpublickeyforreferences - NOT IMPLEMENTED
- /align - NOT IMPLEMENTED
- /closed - NOT IMPLEMENTED
- /allowdup:Type allows the specified type for being duplicated in input assemblies
- /allowduplicateresources allows to duplicate resources in output assembly (by default they're ignored)
- /zeropekind allows assemblies with Zero PeKind (but obviously only IL will get merged)
- /wildcards allows (and resolves) file wildcards (e.g. `*`.dll) in input assemblies
- /parallel use as many CPUs as possible to merge the assemblies
- /pause pause execution once completed (good for debugging)
- /verbose shows more logs
- /link minifies (aka link) the generated assembly, see [Linker](#Linker)
- /markpublic mark public types for non-removal, see [Linker](#Linker)
- /out:<path> target assembly path, symbol/config/doc files will be written here as well
- <path_to_primary> primary assembly, gives the name, version to the merged one
- <other_assemblies> ...
Note: for compatibility purposes, all options can be specified using '/', '-' or '--' prefix.
Enabling the linker (/link
) will make ILRepack apply the following Mono.Linker processing:
- recursively mark all accessible types/methods/fields/properties
- sweep everything which wasn't marked
You can tune the mark step in several ways:
-
for executable output, the entry point (
Main
) will be automatically marked -
if you supply
/markpublic
, all public types will be marked (usually suitable for dlls) -
you can embbed an XML resource within your assembly with the name:
[output_assembly_name].xml
and the list of types/namespaces to mark:Note that VS prefixes the embedded resource name with the namespace, hence you need to modify your csproj to specify the logical name like:
<EmbeddedResource Include="Steps\Linker\ILRepack.xml">
<LogicalName>ILRepack.xml</LogicalName>
</EmbeddedResource>
- you can apply a [Preserve] attribute (matched by name, whatever the namespace) to the types you want to preserve.
class PreserveAttribute : Attribute {
// set to true if you want the fields/methods to be preserved, not just the type itself
public bool AllMembers;
}
[Preserve(AllMembers = true)]
public class SomeTypeToBePreserved
Usual stuff which breaks minification:
- types/methods/fields/properties used by reflection/binding only e.g. you may want to preserve all your view models
- use of dynamic vars
- COM interfaces (you may want to preserve them)
Builds directly from within VS, or using gradle:
git clone --recursive https://github.com/gluck/il-repack.git
cd il-repack
gradlew.bat msbuild
- Crash-testing
- Add remaining features from ILMerge (closed / align)
- Un-fork Cecil
- Merge import process & reference fixing
- PDBs & MDBs should be merged (Thanks Simon)
- Fixed internal method overriding public one which isn't allowed in the same assembly (Simon)
- Attribute merge (/copyattrs)
- XML documentation merge
- Clean command line parameter parsing
- Add usage / version
- App.config merge
- Internalizing types (Simon)
- Delay signing (Simon)
- Target platform selection (Simon)
- Automatic internal type renaming
If you like this tool and want to express your thanks, you can contribute either time to the project (issue triage or pull-requests) or donate money to the Free Software Foundation.