.NET, Architecture, ALM, Cloud
Quand nous découpons nos projets en différents composant/assemblies, on obtient forcément au final plusieurs dlls comme livrable.
Or lorsque nous voulons donner à un client une application ou un SDK, il est préférable de lui donner qu’une libraire ou un exécutable. Cela est surtout vrai pour un SDK.
Prenons l’exemple suivant. Nous avons 4 librairies représentant notre SDK :

<ProjectDefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<CreateItem Include="@(ReferencePath)" Condition="'%(CopyLocal)'=='true' and '%(ReferencePath.IlMerge)'=='true'">
<Output TaskParameter="Include" ItemName="IlmergeAssemblies"/>
</CreateItem>
<Message Text="MERGING: @(IlmergeAssemblies->'%(Filename)')" Importance="High" />
<Exec Command=""$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe"/out:@(MainAssembly) "@(IntermediateAssembly)" @(IlmergeAssemblies->'"%(FullPath)"', ' ')" />
</Target>
<Target Name="_CopyFilesMarkedCopyLocal"/>
</Project>
<!--... -->
<ItemGroup>
<ProjectReference Include="..\Demo.Core.Tools\Demo.Core.Tools.csproj">
<Project>{274635C4-07F8-4B47-A795-6C7983EE3119}</Project>
<Name>Demo.Core.Tools</Name>
<IlMerge>True</IlMerge>
</ProjectReference>
<ProjectReference Include="..\Demo.Services.Client\Demo.Services.Client.csproj">
<Project>{6684A57D-C072-4A5E-9C3A-8178B7A49DD6}</Project>
<Name>Demo.Services.Client</Name>
<IlMerge>True</IlMerge>
</ProjectReference>
<ProjectReference Include="..\Demo.Services.Contract\Demo.Services.Contract.csproj">
<Project>{9D68BA84-4E7C-46FF-A004-A136B1B6FE56}</Project>
<Name>Demo.Services.Contract</Name>
<IlMerge>True</IlMerge>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Ilmerge.CSharp.targets" />
<!--... -->
IlDasm nous confirme bien que nos trois références ont été fusionnées :
Les différentes options proposées par IlMerge sont nombreuses :
ilmerge [/lib:directory]* [/log[:filename]] [/keyfile:filename [/delaysign]] [/internalize[:filename]] [/t[arget]:(library|exe|winexe)] [/closed] [/ndebug] [/ver:version] [/copyattrs [/allowMultiple]] [/xmldocs] [/attr:filename] ([/targetplatform:<version>[,<platformdir>]]|v1|v1.1|v2|v4) [/useFullPublicKeyForReferences] [/zeroPeKind] [/wildcards] [/allowDup[:typename]]* [/allowDuplicateResources] [/union] [/align:n] /out:filename <primary assembly> [<other assemblies>...]
Vous pouvez donc personnaliser votre fichier target « Ilmerge.CSharp .targets » pour notamment :