Ich möchte eine .NET DLL-Assembly und ein C # -Klassenbibliotheksprojekt, auf das von einem VB.NET Console Application-Projekt verwiesen wird, in einer ausführbaren Befehlszeilenkonsole zusammenführen.
Ich kann dies mit ILMerge über die Befehlszeile tun, möchte diese Zusammenführung von Referenzassemblys und -projekten jedoch 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 spezifisches Beispiel finden, da MSBuild ein großes Thema ist. Außerdem finde ich einige Referenzen, die den ILMerge-Befehl zum Post-Build-Ereignis hinzufügen.
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?
Wie knüpft dies an eine mögliche ILMerge.Targets-Datei an?
Ist es besser, das Post-Build-Ereignis zu verwenden?
quelle
Antworten:
Das NuGet-Paket " MSBuild ILMerge task " (oder
MSBuild.ILMerge.Task
) macht diesen Vorgang recht einfach. Standardmäßig werden alle "lokalen" Referenzen in Ihre Hauptbaugruppe kopiert.Hinweis: Obwohl die Pakete ähnliche Namen haben, unterscheidet sich dieses von
ILMerge.MSBuild.Tasks
dem in seiner Antwort erwähnten Davide Icardi . Die hier vorgeschlagene wurde erstmals im August 2014 veröffentlicht.quelle
Hier eine alternative Lösung:
1) Installieren Sie das ILMerge.MSBuild.Tasks-Paket von Nuget
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) -> $(MergedAssembly)" Importance="high" /> <ILMerge InputAssemblies="@(MergeAsm)" OutputFile="$(MergedAssembly)" TargetKind="SameAsPrimaryAssembly" /> </Target>
3) Erstellen Sie Ihr Projekt wie gewohnt.
quelle
Einige weitere Informationen, die für einige Leute, die die Lösung von Scott Hanselman implementieren, nützlich sein könnten .
Als ich dies zum ersten Mal einrichtete, beschwerte es sich darüber, dass Verweise auf System.Core usw. nicht aufgelöst werden konnten. Dies hat etwas mit der Unterstützung von .NET 4 zu tun. Das Einfügen eines / lib-Arguments, das auf das .NET 4 Framework-Verzeichnis verweist, behebt es (in der Tat nur das $ (MSBuildBinPath)).
/lib:$(MSBuildBinPath)
Ich fand dann heraus, dass IlMerge beim Zusammenführen hängen bleiben würde. Es verbrauchte ein bisschen CPU und viel RAM, gab aber nichts aus. Ich habe das Update für den Stackoverflow natürlich gefunden .
/targetplatform:v4
Ich fand auch heraus, dass einige der MSBuild-Eigenschaften, die in Scotts Blog-Artikel verwendet wurden, auf der Ausführung von MsBuild aus dem Projektverzeichnis beruhten, also habe ich sie ein wenig optimiert.
Ich habe dann die Ziele & ilmerge.exe in den Tools-Ordner unseres Quellbaums verschoben, was eine weitere kleine Änderung an den Pfaden erforderlich machte ...
Am Ende hatte ich schließlich das folgende Exec- Element, um das in Scotts Originalartikel zu ersetzen:
<Exec Command=""$(MSBuildThisFileDirectory)Ilmerge.exe" /lib:$(MSBuildBinPath) /targetplatform:v4 /out:@(MainAssembly) "$(MSBuildProjectDirectory)\@(IntermediateAssembly)" @(IlmergeAssemblies->'"%(FullPath)"', ' ')" />
UPDATE Ich fand auch die Antwort von Logic Labs , das CopyLocal-Verhalten beizubehalten und nur ilMerged-Assemblys von CopyLocal auszuschließen, wenn Sie Nuget-Pakete verwenden. Andernfalls müssen Sie für jedes Paketverzeichnis der referenzierten Assemblys, die nicht zusammengeführt werden, ein / lib-Argument angeben.
quelle
Der Artikel Sprachen in einer einzelnen Assembly in Visual Studio nahtlos mit ILMerge und MSBuild mischen unter http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlessWithILMergeAndMSBuild.aspx zeigt, wie ILMerge und MSBuild in Visual Studio verwendet werden.
quelle
Ein Problem, das ich mit dem Artikel gefunden habe: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamhlessWithILMergeAndMSBuild.aspx .
Wenn Sie Verweise haben, die Sie nicht auf ILMerge übertragen möchten, schlägt der Code im Artikel fehl, da er das Standardverhalten von CopyLocal überschreibt, um nichts zu tun.
Um dies zu beheben - Anstelle von:
<Target Name="_CopyFilesMarkedCopyLocal"/>
Fügen Sie diesen Eintrag stattdessen zur Zieldatei hinzu (nur .NET 3.5) (um die nicht ilmerge kopylokalen Dateien herauszufiltern und 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>
quelle
Dies ist ein großartiger Artikel , der Ihnen zeigt, wie Sie Ihre referenzierten Assemblys in die Ausgabe-Assembly zusammenführen. Es zeigt genau, wie Assemblys mit msbuild zusammengeführt werden.
quelle
Meine 2 Cent - Ich habe @ Jasons Antwort aufgegriffen und sie für meine Lösung zum Laufen gebracht, bei der ich die * .exe im Ordner bin / Debug mit allen * .dlls im selben Ordner generieren wollte.
<Exec Command=""$(SolutionDir)packages\ILMerge.2.13.0307\Ilmerge.exe" /wildcards /out:"$(SolutionDir)..\$(TargetFileName)" "$(TargetPath)" $(OutDir)*.dll" />
Hinweis: Diese Lösung ist offensichtlich in der ILMerge Nuget-Paketversion fest codiert. Bitte lassen Sie mich wissen, wenn Sie Verbesserungsvorschläge haben.
quelle
Bearbeiten Sie die * .csproj-Datei des Projekts, das Sie zusammenführen möchten, indem Sie den folgenden Code hinzufügen:
<Target Name="AfterBuild" Condition=" '$(ConfigurationName)' == 'Release' " BeforeTargets="PostBuildEvent"> <CreateItem Include="@(ReferenceCopyLocalPaths)" Condition="'%(Extension)'=='.dll'"> <Output ItemName="AssembliesToMerge" TaskParameter="Include" /> </CreateItem> <Exec Command=""$(SolutionDir)packages\ILMerge.3.0.29\tools\net452\ILMerge.exe" /internalize:"$(MSBuildProjectPath)ilmerge.exclude" /ndebug /out:@(MainAssembly) "@(IntermediateAssembly)" @(AssembliesToMerge->'"%(FullPath)"', ' ')" /> <Delete Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" /> </Target>
Anmerkungen:
$(SolutionDir)packages\ILMerge.3.0.29\tools\net452\ILMerge.exe
Sie durch den Pfad, in dem Sie sich befindenILMerge.exe
.Condition
im Ziel entfernen, um es auch beim Debuggen zusammenzuführen, aber dann funktioniert der Debugger möglicherweise nicht/internalize:"$(MSBuildProjectPath)ilmerge.exclude"
quelle
Lesen Sie diesen Artikel von Jomo. Er hat einen schnellen Prozess, um ILMerge in das msbuild-System zu hacken
quelle