¿Cómo combinar varios ensambles en uno?

Estoy consumiendo mi stack de servicios utilizando el proyecto EXE (tarea de inicio para la aplicación azul) en que he copiado la DLL de la stack de servicios y algunas DLL de Azure en el proyecto EXE.

dlls

Cuando construyo este proyecto EXE, las DLL de Azure se incluirán en mi EXE, pero la DLL de la stack de servicios no se incluirá con EXE, ya que para ejecutar mi EXE en cualquier máquina, necesito copiar todas las DLL de la stack de servicios manualmente.

He usado el dll de esta stack de servicios para usar

JsonServiceClient client = new JsonServiceClient(servicepath); 

¿Qué debería hacer para agrupar todas estas DLL en mi EXE?

Tienes varias opciones:

  • usa ILMerge (gratis)
    Para ver cómo ver aquí y aquí

O

  • use alguna herramienta como SmartAssembly (comercial)
    puede incrustarse y combinarse entre otras cosas (no es necesario cambiar el código fuente)

O

  • codifíquese usted mismo en menos de 10 líneas (cambio de código fuente gratuito pero mínimo)
    marque todas las dependencias necesarias como “recurso incrustado” – de esta manera se incluyen en el archivo EXE … necesita configurar un controlador AssemblyResolve que en el tiempo de ejecución lea desde Recursos y devuelva las DLL necesarias al .NET runtime …

La herramienta que está buscando se llama ILMerge . Es una herramienta de línea de comandos y se puede usar así:

 ilmerge /target:winexe /out:MyApp.exe MyExe.exe ServiceStack.dll ServiceStack.Interfaces.dll ServiceStack.ServiceInterface.dll ServiceStack.Text.dll 

También hay un artículo que describe cómo incluir ILMerge en la configuración de su proyecto VS aquí

Una gran herramienta para incluir ensambles referenciados como recursos integrados es Costura (un complemento de Fody ). El autor Simon Kropp lo describe de la siguiente manera:

[…] una combinación de dos métodos:

  • Sugerencia de Jeffrey Richter de utilizar recursos integrados como método de fusión de ensamblajes
  • Sugerencia de Einar Egilsson usando cecil para crear inicializadores de módulo

El resultado es una solución súper simple que simplemente requiere recuperar Costura.Fody de NuGet.

caracteristicas:

  • Incluyendo símbolos de depuración
  • Compresión de ensambles integrados
  • Incluir / excluir conjuntos específicos
  • Otros (ver Léame )

Pruebe ILMerge-GUI, la fusión .NET . Es un Ilmerge basado en GUI que evita todo el trabajo de línea de comandos.

Si tiene dependencias WPF, sus opciones pueden ser más limitadas … ILMerge no parece tratar con esto. Costura.Fody (como lo mencionó Codefox arriba) funcionó perfectamente para nosotros, sin embargo, tomó aproximadamente 5 minutos para ponerse en marcha … una muy buena experiencia.

Instalar con Nuget (seleccionando el proyecto predeterminado correcto en la consola de Package Manager).

Combina todas las DLL marcadas como “Copiar local” = verdadero y produce un .EXE fusionado (junto con el resultado estándar, la mayoría de los cuales ahora no es necesario) que también está comprimido. Esto se puede usar de forma independiente.

La licencia es MIT, por lo que puede modificar / distribuir según sea necesario.

https://github.com/Fody/Costura/

Consulte el proyecto ServiceStack.Gap , que muestra varios ejemplos de cómo ILMerge ServiceStack en un solo .exe multiplataforma.

ServiceStack también incluye una serie de otras características que son especialmente adecuadas para crear aplicaciones integradas donde:

  • Permite que sus servicios sean alojados automáticamente usando el Escuchador HTTP de .NET
  • Admite Vistas Razor pre comstackdas
  • Admite recursos integrados
  • Admite una base de datos incrustada en Sqlite y OrmLite
  • Puede ser ILMerged en un solo .exe