79 votes

Comment intégrer ILMerge au processus de construction de Visual Studio afin de fusionner des assemblages?

Je veux fusionner .NET DLL assemblée et une Bibliothèque de classes C# projet référencé par un VB.NET projet d'Application Console dans une console de ligne de commande exécutable.

Je peux le faire avec ILMerge à partir de la ligne de commande, mais je veux intégrer cette fusion de référence des assemblées et des projets dans le projet Visual Studio. De ma lecture, je comprends que je peux le faire à travers une Tâche MSBuild ou d'une Cible, il suffit de l'ajouter à un C#/VB.NET fichier de Projet, mais je ne trouve pas d'exemple précis depuis MSBuild est grand sujet. Par ailleurs, j'ai quelques références ajouter le ILMerge commande pour le Post-événement de construction.

  1. Comment puis-je intégrer ILMerge dans Visual Studio (C#/VB.NET), qui sont juste MSBuild projets, de fusionner tous les assemblys référencés (copie locale=true) dans une assemblée?

  2. Comment cette cravate en une possible ILMerge.Les objectifs de fichier?

  3. Est-il préférable d'utiliser le Post-créer un événement?

21voto

Davide Icardi Points 2215

Voici une solution alternative:

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

PM> Paquet d'installation 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.

18voto

Jason Duffett Points 742

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

Quand j'ai d'abord définir ce qu'il allait se plaindre de ne pas être en mesure de résoudre les références au Système.De base, etc. C'est quelque chose à faire avec .NET 4. Y compris un /lib argument pointant vers le .NET 4 Cadre répertoire fixe (en fait, il suffit d'inclure l' $(MSBuildBinPath)).

/lib:$(MSBuildBinPath)

J'ai alors constaté que IlMerge serait de se bloquer lors de la fusion. C'est à l'aide d'un peu de CPU et beaucoup de RAM, mais n'était pas sortie de rien. J'ai trouvé la solution sur stackoverflow de cours.

/targetplatform:v4

J'ai aussi constaté que certains MSBuild propriétés utilisées dans le blog de Scott article est fondé sur l'exécution de MsBuild à partir du répertoire du projet, donc j'ai modifié un peu.

J'ai ensuite passé les cibles et ilmerge.exe dans le dossier tools de notre arborescence des sources, qui ont requis un autre petit tweak pour les chemins d'accès...

J'ai enfin terminé de la façon suivante Exec élément à remplacer celui de Scott de l'article original:

<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 aussi trouvé la Logique des Laboratoires de réponse sur le fait de garder le CopyLocal comportement et juste à l'exclusion de ilMerged assemblées de CopyLocal essentiel si vous êtes en utilisant les packages Nuget. Sinon, vous devez spécifier un /lib argument pour chaque répertoire du package d'assemblys référencés qui ne sont pas fusionnés.

16voto

AMissico Points 12837

L'article Mixing Languages in Assembly dans Visual Studio avec ILMerge et MSBuild à l' adresse http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx explique comment utiliser ILMerge et MSBuild dans un projet Visual Studio.

9voto

Logic Labs Points 349

Seul problème 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 ILMerge le code dans l'article ne fonctionne pas car il remplace la valeur par défaut CopyLocal comportement à ne rien faire.

Pour corriger ceci, au Lieu de:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

Ajouter cette entrée pour les objectifs de fichier à la place (.NET 3.5 uniquement) (afin de filtrer le non-ilmerge copylocal fichiers, et de les traiter comme d'habitude)

<Target Name="AfterResolveReferences">
    <Message Text="Filtering out ilmerge assemblies from ReferenceCopyLocalPaths" Importance="High" />
    <ItemGroup>
        <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.IlMerge)'=='true'" />
    </ItemGroup>
</Target>

4voto

Rohan West Points 5914

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X