web-dev-qa-db-fra.com

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

Je veux fusionner un .NET DLL Assembly et un projet de bibliothèque de classes C # référencé par un projet d'application de console VB.NET dans un exécutable de console de ligne de commande.

Je peux le faire avec ILMerge à partir de la ligne de commande, mais je veux intégrer cette fusion d'assemblys et de projets de référence dans le projet Visual Studio. D'après ma lecture, je comprends que je peux le faire via une tâche MSBuild ou une cible et l'ajouter simplement à un fichier de projet C #/VB.NET, mais je ne peux trouver aucun exemple spécifique car 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 projet Visual Studio (C #/VB.NET), qui ne sont que des projets MSBuild, pour fusionner tous les assemblys référencés (copy-local = true) en un seul assembly?

  2. Comment est-ce lié à un éventuel fichier ILMerge.Targets?

  3. Est-il préférable d'utiliser l'événement Post-build?

72
AMissico

L'article Mixing Languages ​​in a Single Assembly in Visual Studio seamlessly with ILMerge and MSBuild at http://www.hanselman.com/blog /MixingLanguagesInASingleAssemblyInVisualStudioS SeamlesslyWithILMergeAndMSBuild.aspx montre comment utiliser ILMerge et MSBuild dans un projet Visual Studio.

15
AMissico

La " tâche MSBuild ILMerge " (ou MSBuild.ILMerge.Task) Le package NuGet rend ce processus assez simple. Par défaut, il fusionne toutes les références "copie locale" dans votre assembly principal.

Remarque: Bien que les packages aient des noms similaires, celui-ci est différent de ILMerge.MSBuild.Tasks que Davide Icardi a mentionné dans son réponse . Celui que je propose ici a été publié pour la première fois en août 2014.

56
Holistic Developer

Quelques informations supplémentaires qui pourraient être utiles à certaines personnes implémentant la solution de Scott Hanselman .

Lorsque je l'ai configuré pour la première fois, il se plaindrait de ne pas pouvoir résoudre les références à System.Core, etc. C'est quelque chose à voir avec la prise en charge de .NET 4. L'inclusion d'un argument/lib pointant vers le répertoire .NET 4 Framework le corrige (en fait, il suffit d'inclure le $ (MSBuildBinPath)).

/lib:$(MSBuildBinPath)

J'ai ensuite constaté qu'IlMerge se bloquerait lors de la fusion. Il utilisait un peu de CPU et beaucoup de RAM mais ne produisait rien. J'ai trouvé le correctif sur stackoverflow bien sûr .

/targetplatform:v4

J'ai également constaté que certaines des propriétés MSBuild utilisées dans l'article de blog de Scott reposaient sur l'exécution de MsBuild à partir du répertoire du projet, je les ai donc légèrement modifiées.

J'ai ensuite déplacé les cibles & ilmerge.exe vers le dossier tools de notre arborescence source qui nécessitait un autre petit Tweak aux chemins ...

J'ai finalement fini avec l'élément Exec suivant 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é réponse de Logic Labs à propos du maintien du comportement CopyLocal et de l'exclusion Les assemblys ilMerged de CopyLocal sont essentiels si vous utilisez des packages Nuget. Sinon, vous devez spécifier un argument/lib pour chaque répertoire de package des assemblys référencés qui ne sont pas fusionnés.

18
Jason Duffett

Voici une solution alternative:

1) Installez le package ILMerge.MSBuild.Tasks à partir de nuget

PM> Install-Package ILMerge.MSBuild.Tasks

2) Modifiez le fichier * .csproj du 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.

18
Davide Icardi

Un problème que j'ai trouvé avec l'article à: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioS SeamlesslyWithILMergeAndMSBuild.aspx .

Si vous avez des références que vous ne souhaitez pas à ILMerge, le code de l'article échoue car il remplace le comportement CopyLocal par défaut pour ne rien faire.

Pour résoudre ce problème - Au lieu de:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

Ajoutez plutôt cette entrée au fichier cible (.NET 3.5 uniquement) (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
Logic Labs

C'est un excellent article qui vous montrera comment fusionner vos assemblys référencés dans l'assembly de sortie. Il montre exactement comment fusionner des assemblys à l'aide de msbuild.

4
Rohan West

Mes 2 cents - J'ai récupéré la réponse de @ Jason et l'ai fait fonctionner pour ma solution où je voulais générer le * .exe dans le dossier bin/Debug avec tous les * .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" /> 

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

1
rui

Consultez cet article de Jomo. Il a un processus rapide pour pirater ILMerge dans le système msbuild

0
JaredPar