Questão:
Software para agrupar conjuntos .NET em um único conjunto
allquixotic
2014-02-05 04:16:42 UTC
view on stackexchange narkive permalink

Digamos que eu tenha um programa .NET / CLR Hello.exe (ou uma DLL Hello.dll ) que depende de várias DLLs .NET de terceiros. Quero enviar um único arquivo, sem fornecer um "instalador" real, então estou procurando algum software que possa compactar todas as dependências no executável e carregá-las antes que meu código comece a ser executado.

Também preciso carregar incondicionalmente todas as DLLs fornecidas, não apenas "on-demand", porque alguns dos tipos nas DLLs são acessados ​​por meio de reflexão e, portanto, o carregador de classes nunca tentará carregar explicitamente a DLL e portanto, chame o gancho do carregador de classes. Não quero ter que adicionar código ao meu executável se for possível fazer isso sem meu próprio código.

Estou usando SharpDevelop e .NET Framework 4.0 Full Profile, mas a solução ideal para este problema será independente de IDE e funcionará com .NET 3.0 ou posterior (2.0 seria ainda melhor, mas não vamos ser gananciosos ...)

Você poderia potencialmente compactar os assemblies em um único arquivo e, em seguida, após o carregamento do aplicativo - jogá-los em um diretório temporário para possível carregamento e, em seguida, usar `Assembly.LoadFrom` para fazer o trabalho real?
Essas DLLs de terceiros são gerenciadas ou nativas? Você precisa compactar o .NET Framework também, ou seja, executar seu aplicativo sem instalar o .NET?
Não, não preciso executar o aplicativo sem o .NET Framework instalado. As DLLs de terceiros são principalmente assemblies .NET puros, mas alguns são nativos.
Trzy respostas:
#1
+8
BatteryBackupUnit
2014-06-19 11:19:05 UTC
view on stackexchange narkive permalink

Que tal ILMerge? Já existe há muito tempo e há muitos recursos. Por exemplo, aqui está uma introdução rápida. Além disso, as questões do stackoverflow já cobriram algumas armadilhas comuns, como Mesclando DLL com EXE.

Também é independente do seu ambiente de construção. Você só precisa incorporá-lo ao seu processo de construção.

O ILMerge infelizmente não é perfeito. Por exemplo, ele não suporta a fusão de assemblies WPF. A alternativa é incorporar as bibliotecas como recursos e carregá-las dinamicamente. Por exemplo, veja esta postagem do blog. O contêiner LibZ que o allquixotic mencionou basicamente faz isso.

Para o contêiner LibZ, há outra alternativa, uma que foi testada e eu pensaria seriamente: Fody.Costura

Mono mkbundle pode ser outra alternativa, por favor note que ele produz código nativo. As dependências podem ser vinculadas estaticamente. No Windows, também requer cygwin para ser executado (veja também este tópico do fórum)

#2
+5
allquixotic
2014-02-05 04:55:11 UTC
view on stackexchange narkive permalink

LibZ Container instrumenta seu assembly principal com código que descompacta recursos de assembly compactados do arquivo de recursos e os carrega da memória. Ele afirma trabalhar com código de reflexão e também com nomes fortes e não modifica os arquivos de montagem originais de forma alguma, então referências com nomes fortes funcionarão bem.

Você poderia falar um pouco mais sobre essa ferramenta? Adicionar alguma experiência pessoal à sua recomendação? É fácil de configurar / usar? Talvez adicione um exemplo?
#3
  0
allquixotic
2014-02-05 04:53:41 UTC
view on stackexchange narkive permalink

il-repack satisfaz parcialmente os critérios da resposta, mas infelizmente reempacota os assemblies, o que quebra seu nome forte, portanto, se você depender de assemblies assinados com um nome forte, isso ganhou 't funciona. Ele também não funciona com a maioria dos códigos de reflexão até que os assemblies tenham sido carregados pela classe.

Você poderia falar um pouco mais sobre essa ferramenta? Adicionar alguma experiência pessoal à sua recomendação? É fácil de configurar / usar? Talvez adicione um exemplo?


Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 3.0 sob a qual é distribuído.
Loading...