Como mesclar vários assemblies em um?

87

Estou consumindo minha pilha de serviço usando o projeto EXE (tarefa de inicialização do aplicativo azure), pois copiei a DLL da pilha de serviço a seguir e algumas DLLs do Azure para o projeto EXE.

dlls

Quando eu construo esse projeto EXE, as DLLs do Azure serão agrupadas com meu EXE, mas a DLL da pilha de serviço não será agrupada com EXE, porque para executar meu EXE em qualquer máquina, preciso copiar todas as DLLs da pilha de serviço manualmente.

Eu usei a dll desta pilha de serviço para usar

JsonServiceClient client = new JsonServiceClient(servicepath);

O que devo fazer para agrupar todas essas DLLs em meu EXE?

Arun Rana
fonte

Respostas:

120

Você tem várias opções:

OU

  • use alguma ferramenta como SmartAssembly (comercial)
    que pode incorporar e mesclar entre outras coisas (não há necessidade de alterar seu código-fonte)

OU

  • codifique que você mesmo em menos de 10 linhas (mudança gratuita, mas mínima no código-fonte)
    marque todas as dependências necessárias como "recurso incorporado" - desta forma, elas são incluídas no arquivo EXE ... você precisa configurar um AssemblyResolvemanipulador que, em tempo de execução, leia os Recursos e retorna as DLLs necessárias para o tempo de execução do .NET ...
Yahia
fonte
4
Obrigado por me lembrar da solução de Jeffrey Richter de incorporar assemblies! Veja minha resposta mencionando Costura para uma ferramenta que combina isso com a injeção do código necessário.
CodeFox
29

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 incluir ILMerge em sua configuração de projeto VS aqui

yas4891
fonte
Olá, posso adicionar recurso externo (arquivo / imagem) ao executável?
Emdadul Sawon
@EmdadulSawon talvez você possa incluí-los como recursos em uma de suas bibliotecas?
Alexander
27

Uma ótima ferramenta para incluir assemblies referenciados como recursos incorporados é Costura (um suplemento Fody ). O autor Simon Kropp o descreve da seguinte maneira:

[...] uma combinação de dois métodos:

O resultado é uma solução super simples que requer apenas a busca do Costura.Fody no NuGet.

Recursos:

  • Incluindo símbolos de depuração
  • Compressão de montagens embutidas
  • Incluindo / excluindo montagens específicas
  • Outros (consulte o Leiame )
CodeFox
fonte
9
OMG Costura.Fody é a resposta certa. Instalei o pacote do nuget, reconstruí o projeto e agora tenho um EXE autônomo FANTÁSTICO !!
Eric Labashosky,
4
Não posso acreditar como é fácil. Basta instalar os pacotes do nuget e pronto.
iraSenthil
2
Estou usando o Costura.Fody também. É trivial de configurar e muito fácil incluir pacotes NuGet como recursos. Obtenha o projeto.
Michael Silver
1
@ user3700562, esta técnica não cria novos assemblies, mas incorpora um ou mais assemblies referenciados em um existente.
CodeFox
1
Ótima solução! Eu uso há um ano e não tive problema. Mas observe que ele inclui apenas assemblies referenciados por seu projeto principal. Se seu aplicativo faz referência a outro projeto que faz referência a um conjunto de terceiros, você precisa adicioná-lo ao seu projeto de nível superior.
Demir,
7

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

Pritam
fonte
2
Fantástico! Funcionou muito bem para mim!
Alex Pelletier
1
Codeplex está sendo encerrado, então aqui está o link do projeto movido: bitbucket.org/wvd-vegt/ilmergegui
Hegi
3

Se você tiver dependências do WPF, suas opções podem ser mais limitadas ..... ILMerge não parece lidar com isso. Costura.Fody (como mencionado pelo Codefox acima) funcionou perfeitamente para nós e levou cerca de 5 minutos para começar ... uma experiência muito boa.

Instale com Nuget (selecionando o projeto padrão correto no console do gerenciador de pacotes).

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

A licença é MIT para que você possa modificar / distribuir conforme necessário.

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

rexall
fonte
2

Saída do ServiceStack.Gap projecto que mostra diversos exemplos de COMO ILMerge ServiceStack em uma única plataforma cruzada exe .

ServiceStack também inclui uma série de outros recursos que são particularmente adequados para a criação de aplicativos incorporados onde:

  • Permite que seus serviços sejam auto-hospedados usando HTTP Listener do .NET
  • Suporta Visualizações Razor pré-compiladas
  • Suporta Recursos Embutidos
  • Suporta um banco de dados embutido em Sqlite e OrmLite
  • Pode ser ILMerged em um único .exe
mito
fonte
1

.net core 3 introduz duas novas opções na configuração do projeto, chamadas publicação e corte de arquivo único.

Você pode encontrar mais detalhes sobre os documentos aqui , a configuração do projeto copiada aqui para referência.

  1. Configuração do projeto:
    <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

É totalmente compatível com a combinação das duas opções para obter uma única montagem aparada para sua aplicação.

Tanveer Badar
fonte