2010-03-31 56 views
61

Quiero fusionar un ensamblado .NET DLL y un proyecto de biblioteca de clase C# referenciado por un proyecto de aplicación de consola VB.NET en un ejecutable de consola de línea de comandos.Cómo integrar ILMerge en el proceso de compilación de Visual Studio para combinar ensamblajes?

Puedo hacer esto con ILMerge desde la línea de comandos, pero quiero integrar esta combinación de ensamblados de referencia y proyectos en el proyecto de Visual Studio. Según mi lectura, entiendo que puedo hacerlo a través de una tarea de MSBuild o un objetivo y simplemente lo agregué a un archivo de proyecto C#/VB.NET, pero no puedo encontrar ningún ejemplo específico ya que MSBuild es un tema de gran tamaño. Además, encuentro algunas referencias que agregan el comando ILMerge al evento Post-build.

  1. ¿Cómo integro ILMerge en un proyecto (C#/VB.NET) de Visual Studio, que son sólo proyectos de MSBuild, para combinar todos los ensamblados de referencia (copia-locales = true) en una asamblea?

  2. ¿Cómo se relaciona esto con un posible archivo ILMerge.Targets?

  3. ¿Es mejor usar el evento Post-build?

+0

También puede utilizar "Post Generar cadena" de hacerlo como se mencionó [Aquí] [1] [1]: http://stackoverflow.com/questions/2961357/using-ilmerge -with-net-4-libraries/5408079 # 5408079 –

Respuesta

0

Echa un vistazo a este artículo de Jomo. Él tiene un proceso rápido para introducirse en el sistema ILMerge msbuild

+1

El artículo Mezcla de idiomas en un solo ensamblaje en Visual Studio sin problemas con ILMerge y MSBuild en http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx se basa en su blog y mejora la técnica para permitirle combinar selectivamente configurando ILMerge = True/False en el archivo del proyecto. El artículo es mucho más detallado que la entrada del blog de Jomo. – AMissico

4

Esta es una gran article que le mostrará cómo combinar sus ensamblados de referencia en el conjunto de salida. Muestra exactamente cómo combinar ensamblajes usando msbuild.

+1

Fácil pasar por alto su entrada de blog actualizada y más detallada, así que la haré referencia aquí http://www.clariusconsulting.net/blogs/kzu/archive/2009/02/23/LeveragingILMergetosimplifydeploymentandyourusersexperience.aspx. – AMissico

+0

El artículo al que me refiero es más reciente pero menos detallado, tiene algunos comentarios interesantes. –

+3

Ambos enlaces están muertos – WernerCD

8

Un problema que encontré con el artículo en: http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild.aspx.

Si tiene alguna referencia que no desea utilizar ILMerge, el código del artículo falla porque anula el comportamiento predeterminado de CopyLocal para no hacer nada.

Para solucionar este problema - En lugar de:

<Target Name="_CopyFilesMarkedCopyLocal"/> 

Añadir esta entrada a los objetivos archivo en lugar (.NET 3.5 solamente) (para filtrar los archivos CopyLocal no ILMerge, y tratarlos como normal)

<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 sí! Esto es DEFINITIVAMENTE necesario si está usando Nuget; de lo contrario, tendría que especificar la carpeta de contenido del paquete de cada ensamblaje al que se hace referencia que no está fusionando. ¡Gracias! –

17

algunos más información que podría ser útil para algunas personas la implementación Scott Hanselman's solution.

Cuando configuré esto por primera vez, se quejaba de no poder resolver las referencias a System.Core, etc. Tiene algo que ver con el soporte de .NET 4. Incluir un argumento/lib apuntando al directorio .NET 4 Framework lo corrige (de hecho solo incluye el $ (MSBuildBinPath)).

/lib:$(MSBuildBinPath)

entonces me encontré con que ILMerge colgaría mientras que la fusión.Estaba usando un poco de CPU y mucha RAM, pero no estaba produciendo nada. Encontré la corrección on stackoverflow of course.

/targetplatform:v4

También encontré que algunas de las propiedades utilizadas en MSBuild artículo en el blog de Scott se basó en la ejecución de MSBUILD del directorio del proyecto, así que les retocado un poco.

que luego se trasladaron los objetivos & ilmerge.exe a la carpeta de herramientas de nuestro árbol de código fuente que requirió otro pequeño pellizco a los caminos ...

finalmente terminó con el siguiente elemento deExec que debe reemplazar la uno en el artículo original de Scott:

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

ACTUALIZACIÓN también encontré Logic Labs answer acerca de mantener el comportamiento CopyLocal y simplemente excluyendo asambleas ilMerged de Cop yLocal esencial si está utilizando paquetes de Nuget. De lo contrario, debe especificar un argumento/lib para cada directorio de paquete de conjuntos referenciados que no se combinen.

+0

En realidad, terminé descargando ILMerge.exe, agregándolo al control de código fuente y escribiendo algún comando en el evento posterior a la compilación – Haobo

15

Aquí una solución alternativa:

1) Instalar el paquete de ILMerge.MSBuild.Tasks Nuget

PM> Install-Package ILMerge.MSBuild.Tasks

2) Editar el * Archivo .csproj del proyecto que desea fusionar agregando el código siguiente:

<!-- 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) Construya su proyecto como de costumbre.

+0

. Es realmente un pit este paquete no se mantiene mejor. Lo he estado usando pero me falta la capacidad de establecer TargetPlatform, que es significativo para .NET 4.5/.NET 4.0 compat. –

+0

@davidlcardi cómo reemplazar el nombre del archivo de destino, dll_to_merge, etc. – Smith

+0

@Smith TargetFileName ya es una variable de msbuild, por lo que no es necesario que lo reemplace. Los LIB1_To_Merge.dll son nombres corregidos. Probablemente con algunos scripts más complejos de msbuild pueda encontrar todos los ensamblados referenciados, pero no sé cómo hacerlo. –

46

El paquete "MSBuild ILMerge task" (o MSBuild.ILMerge.Task) NuGet hace que este proceso sea bastante simple. Por defecto, fusiona cualquier referencia de "copia local" en su ensamblaje principal.

Nota: Aunque los paquetes tienen nombres similares, éste es diferente de ILMerge.MSBuild.Tasks que Davide Icardi mencionó en su answer. El que estoy sugiriendo aquí fue publicado por primera vez en agosto de 2014.

+3

¡Una solución como debería ser! +1 –

+1

Esta debería ser la solución aceptada. Lo hace realmente indoloro ¡Gracias! –

+0

Agradable: D No es perfecto, ya que "se olvidó" de incluir archivos adicionales en el directorio de salida, pero sigue siendo bueno ^^ – Ethenyl

0

Mis 2 centavos - Elegí la respuesta de Jason y la hice funcionar para mi solución donde quería generar el * .exe en la carpeta bin/Debug con todos los * .dlls dentro de la misma carpeta.

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

Nota: Esta solución está obviamente codificada en la versión del paquete nuget de ILMerge. Por favor, avíseme si tiene alguna sugerencia para mejorar.

Cuestiones relacionadas