Comment intégrer ILMerge dans le processus de construction de Visual Studio pour fusionner des assemblages?

je veux fusionner un ensemble DLL .NET et un projet de bibliothèque C # Class référencé par un VB.NET Console le projet D'Application dans un exécutable de ligne de commande de console.

je peux le faire avec ILMerge depuis la ligne de commande, mais je veux intégrer cette fusion d'assemblages et de projets de référence dans le projet Visual Studio. D'après ce que j'ai lu, je comprends que je peux le faire à travers une tâche MSBuild ou une cible et juste l'ajouter à un C#/VB.Le dossier du projet NET, mais je Je ne trouve pas d'exemple précis puisque MSBuild est un sujet important. De plus, je trouve quelques références qui ajoutent la commande ILMerge à l'événement post-build.

  1. comment intégrer ILMerge dans un studio visuel (C#/VB.NET), qui ne sont que des projets MSBuild, pour fusionner tous les assemblages référencés (copy-local=true) en un seul assemblage?

  2. comment cela se rattache - t-il à un possible ILMerge.Le dossier des cibles?

  3. est-il préférable d'utiliser L'événement Post-construction?

65
demandé sur AMissico 2010-03-31 23:56:10

8 réponses

le paquet NuGet MSBuild ILMerge task " (ou MSBuild.ILMerge.Task ) rend ce processus très simple. Par défaut, il fusionne toutes les références "copier local" dans votre assemblage principal.

Note: bien que les colis aient des noms similaires, celui-ci est différent du ILMerge.MSBuild.Tasks que Davide Icardi a mentionné dans sa réponse . Celui que je suggère ici a été publié pour la première fois en août 2014.

52
répondu Holistic Developer 2017-05-23 12:26:27

Quelques informations qui pourraient être utiles pour certaines personnes, la mise en œuvre de Scott, Hanselman la solution .

lorsque j'ai mis en place ce système pour la première fois, il se plaignait de ne pas être en mesure de résoudre les références au système.De base, etc. C'est en rapport avec le support .NET 4. Incluant l'argument a / lib pointant vers le répertoire .net 4 Framework le corrige (en fait, il suffit d'inclure $(MSBuild Binpath)).

/lib:$(MSBuildBinPath)

j'ai alors constaté Qu'IlMerge serait pendu tout en fusionnant. Il utilisait un peu de CPU et beaucoup de RAM, mais il ne produisait rien. J'ai trouvé le correctif sur stackoverflow bien sûr .

/targetplatform:v4

j'ai aussi trouvé que certaines des propriétés de MSBuild utilisées dans L'article du blog de Scott dépendaient de L'exécution de MsBuild à partir du répertoire du projet, donc je les ai légèrement retouchés.

j'ai ensuite déplacé les cibles & ilmerge.exe vers le dossier Outils de notre arborescence des sources qui nécessitait une autre petite modification des chemins...

j'ai finalement fini avec l'élément suivant Exec pour remplacer celui de L'article original de Scott:

<Exec Command="&quot;$(MSBuildThisFileDirectory)Ilmerge.exe&quot; /lib:$(MSBuildBinPath) /targetplatform:v4 /out:@(MainAssembly) &quot;$(MSBuildProjectDirectory)\@(IntermediateAssembly)&quot; @(IlmergeAssemblies->'&quot;%(FullPath)&quot;', ' ')" /> 

mise à JOUR J'ai également trouvé Logic Labs réponse sur le maintien du comportement CopyLocal et juste à l'exclusion des assemblages ilMerged de CopyLocal essentiel si vous utilisez des paquets Nuget. Sinon, vous devez spécifier un argument a / lib pour chaque répertoire de paquets des assemblages référencés qui ne sont pas fusionnés.

18
répondu Jason Duffett 2017-05-23 11:54:59

Voici une solution alternative:

1) Installer ILMerge.MSBuild.Paquet de tâches de nuget

PM> Install-Package ILMerge.MSBuild.Tâches

2) éditer le *.csproj fichier de projet que vous souhaitez fusionner en ajoutant le code ci-dessous:

  <!-- Code to merge the assemblies into one:setup.exe -->
  <UsingTask TaskName="ILMerge.MSBuild.Tasks.ILMerge" AssemblyFile="$(SolutionDir)\packages\ILMerge.MSBuild.Tasks.1.0.0.3\tools\ILMerge.MSBuild.Tasks.dll" />
  <Target Name="AfterBuild">
    <ItemGroup>
      <MergeAsm Include="$(OutputPath)$(TargetFileName)" />
      <MergeAsm Include="$(OutputPath)LIB1_To_MERGE.dll" />
      <MergeAsm Include="$(OutputPath)LIB2_To_MERGE.dll" />
    </ItemGroup>
    <PropertyGroup>
      <MergedAssembly>$(ProjectDir)$(OutDir)MERGED_ASSEMBLY_NAME.exe</MergedAssembly>
    </PropertyGroup>
    <Message Text="ILMerge @(MergeAsm) -&gt; $(MergedAssembly)" Importance="high" />
    <ILMerge InputAssemblies="@(MergeAsm)" OutputFile="$(MergedAssembly)" TargetKind="SameAsPrimaryAssembly" />
  </Target>

3) Construisez votre projet comme d'habitude.

17
répondu Davide Icardi 2012-11-19 00:08:44

L'article le Mélange des Langues dans une Assemblée Unique dans Visual Studio parfaitement avec ILMerge et MSBuild à http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx montre comment utiliser ILMerge et MSBuild dans un Projet Visual Studio.

15
répondu AMissico 2010-03-31 20:43:19

un numéro que j'ai trouvé avec l'article à: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx .

si vous avez des références que vous ne souhaitez pas Illmerger alors le code dans l'article échoue parce qu'il l'emporte sur le comportement CopyLocal par défaut pour ne rien faire.

pour corriger cela-au lieu de:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

ajouter cette rubrique à le fichier targets à la place (.net 3.5 seulement) (pour filtrer les fichiers copylocaux non-ilmerge, et les traiter comme normaux)

<Target Name="AfterResolveReferences">
    <Message Text="Filtering out ilmerge assemblies from ReferenceCopyLocalPaths" Importance="High" />
    <ItemGroup>
        <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.IlMerge)'=='true'" />
    </ItemGroup>
</Target>
8
répondu Logic Labs 2012-03-07 20:40:14

c'est un grand article qui vous montrera comment fusionner vos assemblages référencés dans l'assemblage de sortie. Il montre exactement comment fusionner des assemblages en utilisant msbuild.

4
répondu Rohan West 2017-02-22 12:29:53

consultez cet article de Jomo. Il dispose d'un processus rapide pour hacker ILMerge dans le système msbuild

0
répondu JaredPar 2010-03-31 20:46:31

mes 2 cents - j'ai pris la réponse de @Jason et l'ai fait fonctionner pour ma solution où je voulais générer l' *.exe dans le dossier bin/Debug avec all *.dll dans le même dossier.

<Exec Command="&quot;$(SolutionDir)packages\ILMerge.2.13.0307\Ilmerge.exe&quot; /wildcards /out:&quot;$(SolutionDir)..$(TargetFileName)&quot; &quot;$(TargetPath)&quot; $(OutDir)*.dll" /> 

Note: Cette solution est évidemment codée en dur dans la version du paquet ILMerge nuget. Veuillez me faire savoir si vous avez des suggestions à améliorer.

0
répondu rui 2014-11-13 18:46:36