Como mesclar vários assemblies em um?

Estou consumindo minha pilha de serviços usando o projeto EXE (tarefa de boot para o aplicativo azul) em que copiei a seguinte DLL da pilha de serviços e algumas DLLs do Azure para o projeto EXE.

dlls

Quando eu construir esse projeto EXE, em seguida, DLLs do Azure será empacotado com meu EXE, mas DLL de pilha de serviço não será empacotado com EXE, porque para executar meu EXE em qualquer máquina eu preciso copiar DLL de pilha de todos os serviços manualmente.

Eu usei essa dll da pilha de serviços para usar

JsonServiceClient client = new JsonServiceClient(servicepath); 

O que devo fazer para empacotar todas essas DLLs no meu EXE?

Você tem várias opções:

  • use ILMerge (grátis)
    Para como ver aqui e aqui

OU

  • use alguma ferramenta como o SmartAssembly (comercial)
    ele pode incorporar e mesclar entre outras coisas (não é necessário alterar seu código-fonte)

OU

  • código que você mesmo em menos de 10 linhas (livre mas mudança mínima de código fonte)
    marcar todas as dependencies necessárias como “recurso incorporado” – dessa forma elas são incluídas no arquivo EXE … você precisa configurar um manipulador AssemblyResolve que, em tempo de execução, lê de Recursos e retorna as DLLs necessárias para o runtime .NET …

A ferramenta que você está procurando é chamada ILMerge . É uma ferramenta de linha de comando e pode ser usada assim:

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

Há também um artigo que descreve como include o ILMerge em sua configuração de projeto do VS aqui

Uma ótima ferramenta para include assemblies referenciados como resources incorporados é o Costura (um suplemento do Fody ). O autor Simon Kropp descreve da seguinte forma:

[…] uma combinação de dois methods:

  • A sugestão de Jeffrey Richter de usar resources incorporados como método de mesclagem de montagens
  • Sugestão de Einar Egilsson usando o cecil para criar inicializadores de módulo

O resultado é uma solução super simples que requer apenas para buscar Costura.Fody de NuGet.

Características:

  • Incluindo símbolos de debugging
  • Compressão de montagens embutidas
  • Incluindo / excluindo conjuntos específicos
  • Outros (consulte o Leiame )

Experimente o ILMerge-GUI, a fusão .NET . É um Ilmerge baseado em GUI que evita todo o trabalho de linha de comando.

Se você tem dependencies do WPF, suas opções podem ser mais limitadas … O ILMerge não parece lidar com elas. Costura.Fody (como mencionado pelo Codefox acima) funcionou perfeitamente para nós no entanto e levou cerca de 5 minutos para ir … uma experiência muito boa.

Instale com o Nuget (selecionando o projeto padrão correto no Console do Gerenciador de Pacotes).

Ele mescla todas as DLLs marcadas como “Copy Local” = true e produz um .EXE mesclado (junto com a saída padrão, a maioria das quais agora não é necessária), que também é compactada. Isso pode ser usado de forma independente.

A licença é MIT, assim você pode modificar / distribuir conforme necessário.

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

Finalize o projeto ServiceStack.Gap , que mostra vários exemplos de como o ILMerge ServiceStack em um único .exe de plataforma cruzada.

O ServiceStack também inclui vários outros resources que são particularmente adequados para a criação de aplicativos incorporados, nos quais:

  • Permite que seus serviços sejam auto-hospedados usando o HTTP Listener do .NET
  • Suporta visualizações Razor pré-compiladas
  • Suporta resources incorporados
  • Suporta um database embutido no Sqlite e OrmLite
  • Pode ser ILMerged em um único exe