¿Cómo fusionar varios ensamblajes en uno?

87

Consumo mi pila de servicios usando el proyecto EXE (tarea de inicio para la aplicación azul) en el sentido de que he copiado la siguiente pila de servicios DLL y algunas DLL de Azure en el proyecto EXE.

dlls

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

He usado la dll de esta pila de servicios para usar

JsonServiceClient client = new JsonServiceClient(servicepath);

¿Qué debo hacer para agrupar todas estas DLL en mi EXE?

Arun Rana
fuente

Respuestas:

120

Tienes varias opciones:

O

  • use alguna herramienta como SmartAssembly (comercial)
    que puede incrustar y fusionar, entre otras cosas (no es necesario cambiar su código fuente)

O

  • código que 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 AssemblyResolvecontrolador que en tiempo de ejecución lee de Recursos y devuelve las DLL necesarias al tiempo de ejecución de .NET ...
Yahia
fuente
4
¡Gracias por recordarme la solución de Jeffrey Richter de incrustar ensamblajes! Vea mi respuesta mencionando Costura para una herramienta que combina esto con la inyección del código necesario.
CodeFox
29

La herramienta que está buscando se llama ILMerge . Es una herramienta de línea de comandos y se puede utilizar 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í

yas4891
fuente
Hola, ¿puedo agregar un recurso externo (archivo / imagen) al ejecutable?
Emdadul Sawon
@EmdadulSawon ¿quizás puedas incluirlos como recursos en una de tus bibliotecas?
Alexander
27

Una gran herramienta para incluir ensamblajes 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:

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

caracteristicas:

  • Incluyendo símbolos de depuración
  • Compresión de conjuntos integrados
  • Incluyendo / excluyendo conjuntos específicos
  • Otros (ver Léame )
CodeFox
fuente
9
Dios mío, Costura, Fody es la respuesta correcta. Instalé el paquete de nuget, reconstruí el proyecto y ahora tengo un EXE independiente ¡IMPRESIONANTE!
Eric Labashosky
4
No puedo creer lo fácil que es. Simplemente instale los paquetes de nuget y listo.
iraSenthil
2
Estoy usando Costura.Fody también. Es trivial de configurar y muy fácil de incluir paquetes NuGet como recursos. Obtener proyecto.
Michael Silver
1
@ user3700562, esta técnica no crea nuevos ensamblajes, sino que integra uno o más ensamblajes referenciados en uno existente.
CodeFox
1
¡Gran solución! Lo uso desde hace un año y no tuve ningún problema. Pero tenga en cuenta que solo incluye ensamblajes a los que hace referencia su proyecto principal. Si su aplicación hace referencia a otro proyecto que hace referencia a un ensamblado de terceros, debe agregarlo a su proyecto de nivel superior.
Demir
3

Si tiene dependencias de WPF, sus opciones pueden ser más limitadas ... ILMerge no parece ocuparse de ellas. Costura.Fody (como lo mencionó Codefox anteriormente) funcionó perfectamente para nosotros sin embargo y tardó unos 5 minutos en comenzar ... una muy buena experiencia.

Instalar con Nuget (seleccionando el proyecto predeterminado correcto en la Consola del Administrador de paquetes).

Combina todas las DLL marcadas como "Copiar local" = verdadero y produce un .EXE combinado (junto con la salida estándar, la mayoría de los cuales ahora no es necesario) que también está comprimido. Esto luego 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/

rexall
fuente
2

De partida de los ServiceStack.Gap proyecto que muestra varios ejemplos de howto ILMerge ServiceStack en un único multiplataforma .exe .

ServiceStack también incluye una serie de otras características que son particularmente adecuadas para estas aplicaciones de creación integradas donde:

  • Permite que sus servicios sean autohospedados mediante el escucha HTTP de .NET
  • Admite vistas de Razor precompiladas
  • Admite recursos integrados
  • Admite una base de datos integrada en Sqlite y OrmLite
  • Puede ser ILMerged en un solo .exe
mito
fuente
1

.net core 3 introduce dos nuevas opciones en la configuración del proyecto, llamadas publicación y recorte de un solo archivo.

Puede encontrar más detalles sobre los documentos aquí , la configuración del proyecto copiada aquí como referencia.

  1. Configuración del proyecto:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. Usando CLI:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

Es totalmente compatible combinar las dos opciones para obtener un conjunto único recortado para su aplicación.

Tanveer Badar
fuente
Esto no le da un solo montaje. Simplemente comprime sus archivos en un archivo zip y luego los descomprime en una carpeta de usuario cuando intenta ejecutar la aplicación.
Jesper