2010-03-31 19 views
61

Voglio unire un assembly .NET DLL e un progetto Libreria di classi C# a cui fa riferimento un progetto di applicazione console VB.NET in un eseguibile della console della riga di comando.Come integrare ILMerge nel processo di compilazione di Visual Studio per unire assiemi?

Posso farlo con ILMerge dalla riga di comando, ma voglio integrare questa unione di assiemi e progetti di riferimento nel progetto Visual Studio. Dalla mia lettura, capisco che posso farlo tramite un Task MSBuild o un Target e aggiungerlo semplicemente a un file di progetto C#/VB.NET, ma non riesco a trovare esempi specifici poiché MSBuild è un argomento di grandi dimensioni. Inoltre, trovo alcuni riferimenti che aggiungono il comando ILMerge all'evento Post-build.

  1. Come si integrano ILMerge in un Visual Studio (C#/VB.NET), che sono solo progetti MSBuild, per unire tutti gli assembly referenziati (copia-locale = true) in un unico montaggio?

  2. In che modo questo si collega a un possibile file ILMerge.Targets?

  3. È meglio utilizzare l'evento Post-build?

+0

È anche possibile utilizzare "Post Build String" per fare che, come indicato [qui] [1] [1]: http://stackoverflow.com/questions/2961357/using-ilmerge -with-net-4-libraries/5408079 # 5408079 –

risposta

14

L'articolo Mixing lingue in un singolo Assembly in Visual Studio perfettamente con ILMerge e MSBuild a http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx dimostra come utilizzare ILMerge e MSBuild all'interno di un progetto di Visual Studio.

+1

C'è un problema con questo codice, se non si desidera ILMerge tutti i riferimenti. Vedi [la mia risposta] (http: // StackOverflow.it/a/9608238/182363) –

0

Date un'occhiata a questo articolo di Jomo. Ha un processo rapido per incidere ILMerge nel sistema msbuild

+1

L'articolo Mescolare le lingue in un singolo assieme in Visual Studio perfettamente con ILMerge e MSBuild su http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx si basa sul suo blog e migliora la tecnica per consentire di unire selettivamente impostando ILMerge = Vero/Falso nel file di progetto. L'articolo è molto più dettagliato del post di blog di Jomo. – AMissico

4

Questo è un grande article che vi mostrerà come unire gli assembly referenziati nel gruppo di uscita. Mostra esattamente come unire gli assiemi usando msbuild.

+1

Facile ignorare la sua voce di blog aggiornata e più dettagliata, quindi farò riferimento qui http://www.clariusconsulting.net/blogs/kzu/archive/2009/02/23/LeveragingILMergetosimplifydeploymentandyourusersexperience.aspx. – AMissico

+0

L'articolo che ho citato è più recente ma meno dettagliato, ha alcuni commenti interessanti. –

+3

Entrambi i collegamenti sono morti – WernerCD

8

Un problema che ho trovato con l'articolo: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx.

Se si dispone di riferimenti che non si desidera visualizzare in ILMerge, il codice nell'articolo non riesce perché sovrascrive il comportamento predefinito di CopyLocal per non eseguire nulla.

Per risolvere questo problema - Invece di:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

Aggiungi questa voce i target file invece (3,5 NET solo) (per filtrare i file CopyLocal non ILMerge, e trattarli come normale)

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

Oh si! Questo è SICURAMENTE necessario se si utilizza Nuget, altrimenti si dovrà specificare la cartella del contenuto del pacchetto di ogni assembly di riferimento che non si sta unendo. Grazie! –

17

qualche informazione in più che potrebbero essere utili per alcune persone attuazione Scott Hanselman's solution.

Quando ho messo questo in su si possa lamentare di non essere in grado di risolvere i riferimenti a System.Core, ecc E 'qualcosa a che fare con .NET 4 supporto. Includere un argomento/lib che punta alla directory .NET 4 Framework lo corregge (in effetti basta includere $ (MSBuildBinPath)).

/lib:$(MSBuildBinPath)

Ho poi scoperto che ILMerge sarebbe appendere, mentre la fusione.Stava usando un po 'di CPU e molta RAM, ma non stava emettendo nulla. Ho trovato la correzione on stackoverflow of course.

/targetplatform:v4

Ho anche scoperto che alcune delle proprietà MSBuild utilizzati nell'articolo blog di Scott invocato esecuzione MsBuild dalla directory del progetto, così ho ottimizzato un po '.

Ho poi spostato gli obiettivi & ilmerge.exe alla cartella strumenti del nostro albero dei sorgenti che ha richiesto un altro piccolo tweak per i sentieri ...

ho finalmente finito con il seguente Exec elemento per sostituire la uno in Articolo originale di Scott:

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

UPDATE ho anche trovato Logic Labs answer su come mantenere il comportamento CopyLocal e proprio escludendo assemblee ilMerged da Cop yLocale essenziale se si utilizzano pacchetti Nuget. Altrimenti è necessario specificare un argomento/lib per ogni directory del pacchetto di assembly referenziati che non vengono uniti.

+0

Alla fine ho finito con il download di ILMerge.exe, aggiungendolo al controllo del codice sorgente e scrivendo qualche comando nell'evento post-build – Haobo

15

Ecco una soluzione alternativa:

1) Installare il pacchetto ILMerge.MSBuild.Tasks da NuGet

PM> Installa-Package ILMerge.MSBuild.Tasks

2) Modificare il * File .csproj del progetto che si desidera unire aggiungendo il seguente codice:

<!-- 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) Costruisci il tuo progetto come al solito.

+0

È davvero un problema che questo pacchetto non è meglio mantenuto. Lo stavo usando ma manca la possibilità di impostare TargetPlatform che è significativo per .NET 4.5/.NET 4.0 compat. –

+0

@davidlcardi come sostituire il nomefile di destinazione, dll_to_merge ecc. – Smith

+0

@Smith TargetFileName è già una variabile msbuild, quindi non è necessario sostituirlo. Il LIB1_To_Merge.dll sono nomi fissi. Probabilmente con alcuni script msbuild più complessi puoi trovare tutti gli assembly di riferimento, ma non so come farlo. –

46

Il pacchetto NuGet "MSBuild ILMerge task" (o MSBuild.ILMerge.Task) rende questo processo abbastanza semplice. Per impostazione predefinita fonde i riferimenti "copia locali" nell'assembly principale.

Nota: Anche se i pacchetti hanno nomi simili, questo è diverso da ILMerge.MSBuild.Tasks che Davide Icardi citato nel suo answer. Quello che sto suggerendo qui è stato pubblicato per la prima volta nell'agosto 2014.

+3

Una soluzione come dovrebbe essere! +1 –

+1

Questa dovrebbe essere la soluzione accettata. Lo rende davvero indolore. Grazie! –

+0

Bello: D Non perfetto perché "dimenticato" di includere file extra nella directory di output, ma comunque buono ^^ – Ethenyl

0

I miei 2 centesimi - Ho raccolto la risposta di @ Jason e l'ho fatto funzionare per la mia soluzione in cui volevo generare * .exe nella cartella bin/debug con tutti * .dlls all'interno della stessa cartella.

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

Nota: questa soluzione è ovviamente codificata nella versione del pacchetto nuget di ILMerge. Per favore fatemi sapere se avete qualche suggerimento per migliorare.

Problemi correlati