web-dev-qa-db-de.com

Integrieren von ILMerge in den Visual Studio-Erstellungsprozess zum Zusammenführen von Baugruppen

Ich möchte ein .NET DLL Assembly- und ein C # -Klassenbibliotheksprojekt, auf das von einem VB.NET-Konsolenanwendungsprojekt verwiesen wird, in einer ausführbaren Befehlszeilenkonsolendatei zusammenführen.

Ich kann dies mit ILMerge von der Befehlszeile aus tun, möchte aber diese Zusammenführung von Referenzassemblys und Projekten in das Visual Studio-Projekt integrieren. Aus meiner Lektüre geht hervor, dass ich dies über eine MSBuild-Aufgabe oder ein Ziel tun und es einfach einer C #/VB.NET-Projektdatei hinzufügen kann, aber ich kann kein bestimmtes Beispiel finden, da MSBuild ein großes Thema ist. Darüber hinaus finde ich einige Verweise, die den ILMerge-Befehl zum Post-Build-Ereignis hinzufügen.

  1. Wie integriere ich ILMerge in ein Visual Studio-Projekt (C #/VB.NET), bei dem es sich nur um MSBuild-Projekte handelt, um alle referenzierten Assemblys (copy-local = true) in einer Assembly zusammenzuführen?

  2. Wie wird dies in eine mögliche ILMerge.Targets-Datei eingebunden?

  3. Ist es besser, das Postbuild-Ereignis zu verwenden?

72
AMissico

Der Artikel Mischen von Sprachen in einer einzelnen Assembly in Visual Studio nahtlos mit ILMerge und MSBuild unter http://www.hanselman.com/blog /MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx veranschaulicht die Verwendung von ILMerge und MSBuild in einem Visual Studio-Projekt.

15
AMissico

Die " MSBuild ILMerge-Task " (oder MSBuild.ILMerge.Task) Das NuGet-Paket macht diesen Vorgang sehr einfach. Standardmäßig werden alle "lokalen Kopier" -Referenzen in Ihrer Hauptbaugruppe zusammengeführt.

Hinweis: Obwohl die Pakete ähnliche Namen haben, unterscheidet sich dieses von ILMerge.MSBuild.Tasks dass Davide Icardi erwähnte in seinem Antwort . Das, was ich hier vorschlage, wurde erstmals im August 2014 veröffentlicht.

56

Einige weitere Informationen, die für einige Leute nützlich sein könnten, die Scott Hanselmans Lösung implementieren.

Als ich dies zum ersten Mal einrichtete, beschwerte ich mich darüber, dass Verweise auf System.Core usw. nicht aufgelöst werden konnten. Dies hat etwas mit der .NET 4-Unterstützung zu tun. Das Einschließen eines/lib-Arguments, das auf das .NET 4 Framework-Verzeichnis verweist, behebt dieses Problem (schließen Sie einfach das $ (MSBuildBinPath) ein).

/lib:$(MSBuildBinPath)

Dann stellte ich fest, dass IlMerge beim Zusammenführen hängen blieb. Es wurde ein bisschen CPU und viel RAM, gab aber nichts aus. Ich fand das Update natürlich auf Stackoverflow .

/targetplatform:v4

Ich fand auch heraus, dass einige der in Scotts Blog-Artikel verwendeten MSBuild-Eigenschaften auf der Ausführung von MsBuild aus dem Projektverzeichnis beruhten, also habe ich sie ein wenig optimiert.

Ich habe dann die Datei "goals & ilmerge.exe" in den Tools-Ordner unseres Quellbaums verschoben, wozu ein weiterer kleiner Tweak an den Pfaden erforderlich war ...

Am Ende hatte ich das folgende Exec Element, um das in Scotts Originalartikel zu ersetzen:

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

[~ # ~] update [~ # ~] Ich habe auch Logic Labs answer über das Beibehalten des CopyLocal-Verhaltens und gefunden Nur das Ausschließen von ilMerged-Assemblys aus CopyLocal ist wichtig, wenn Sie Nuget-Pakete verwenden. Andernfalls müssen Sie für jedes Paketverzeichnis referenzierter Assemblys, die nicht zusammengeführt werden, ein Argument/lib angeben.

18
Jason Duffett

Hier eine alternative Lösung:

1) Installieren Sie das ILMerge.MSBuild.Tasks-Paket vom Nuget

PM> Installationspaket ILMerge.MSBuild.Tasks

2) Bearbeiten Sie die * .csproj-Datei des Projekts, das Sie zusammenführen möchten, indem Sie den folgenden Code hinzufügen:

  <!-- 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) Erstellen Sie Ihr Projekt wie gewohnt.

18
Davide Icardi

Ein Problem mit dem Artikel fand ich unter: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx .

Wenn Sie Verweise haben, die Sie nicht mit ILMerge verknüpfen möchten, schlägt der Code im Artikel fehl, da das standardmäßige Verhalten von CopyLocal außer Kraft gesetzt wird, um nichts zu tun.

Um dies zu beheben - Anstelle von:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

Fügen Sie diesen Eintrag stattdessen der Zieldatei hinzu (nur .NET 3.5) (um die nicht zusammengeführten copylokalen Dateien herauszufiltern und sie wie gewohnt zu behandeln).

<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

Dies ist ein großartiger Artikel , der Ihnen zeigt, wie Sie die Assemblys, auf die verwiesen wird, in die Ausgabe-Assembly einfügen. Es zeigt genau, wie Assemblys mit msbuild zusammengeführt werden.

4
Rohan West

Meine 2 Cent - Ich habe die Antwort von @ Jason aufgegriffen und für meine Lösung verwendet, bei der ich die * .exe im Ordner bin/Debug mit allen * .dlls im selben Ordner generieren wollte.

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

Hinweis: Diese Lösung ist offensichtlich in der ILMerge-Nuget-Paketversion fest programmiert. Bitte lassen Sie mich wissen, wenn Sie Verbesserungsvorschläge haben.

1
rui

Schauen Sie sich diesen Artikel von Jomo an. Er hat einen schnellen Prozess, um ILMerge in das msbuild-System zu hacken

0
JaredPar