O desenvolvimento Winform/wpf inevitavelmente se refere a muitas DLLs de terceiros, mas toda vez que você empacota, precisa copiar os arquivos do diretório Debug para o cliente ou compartilhá-los, o que não é muito conveniente de usar. Já tentei vários softwares para mesclar arquivos dll antes, como ILMerge, Enigma Virtual Box, etc., mas até aprender sobre o "Costura.Fody", sentia que o mundo era muito melhor~
A seguir está um programa escrito por Winform, referenciando as duas DLLs "HttpHelper.dll" e "Newtonsoft.Json.dll"; ao gerarmos o programa, haverá um arquivo exe e esses dois arquivos DLL, o que deixa as pessoas muito desconfortáveis, e se houver uma DLL a menos, o programa pode relatar uma exceção, como mostrado na figura abaixo:
O link abaixo mostra o uso anterior (não recomendado)
Usando a ferramenta Costura.Fody, você pode mesclar a DLL de origem no EXE de destino
Página inicial do projeto: https://github.com/Fody/Costura
Como usar, instalar diretamente o pacote Nuget:
Depois de adicionar com sucesso o Costura.Fody, a solução adicionará automaticamente FodyWeavers.xml arquivo.
Regenerar a solução, você pode ver seu sucesso no diretório de geração de programas, todas as DLLs estão perfeitamente mescladas no exe, você pode copiar diretamente o arquivo exe para o cliente para rodar de forma independente. Como mostrado abaixo:
1>------ Todas as reconstruções já foram iniciadas: Projeto: itsvse, Configuração: Depurar qualquer CPU ------ 1> Fody: Fody (versão 2.0.0.0) Executando 1> Fody/Costura: Nenhuma referência a 'Costura.dll' encontrada. Referências não modificadas. 1> Fody/Costura: Incorporar 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Incorporando 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Terminei o Fody 609ms. 1> Fody: Pulei o assembly de verificação porque está desativado na configuração 1> Fody: Finalizei a verificação em 3ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regenerar todos: 1 tem sucesso, 0 falha e 0 ========== pulado
Como pode ser visto na imagem acima, o arquivo gerado não contém Newtonsoft.Json.dll, HttpHelper.dll e Costura.dll não são gerados, apenas dois arquivos, itsvse.exe podem ser executados diretamente sem erros! (O arquivo PDB pode ser excluído).
Vamos usar a ferramenta ILSpy para descompilar nosso programa e dar uma olhada no código-fonte gerado, como mostrado na figura abaixo:
Introdução ao princípio de implementação
Quando o CLR tenta carregar um assembly, mas falha, ele gera o evento AppDomain.AssemblyResolve. Nosso programa pode ouvir esse evento e retornar o assembly que o CLR está tentando carregar no gerenciador de eventos para que o programa continue funcionando normalmente.
O Fody.Costura incorpora todas as DLLs referenciadas pelo EXE no arquivo EXE ao construir o projeto. Quando um programa usa uma dessas DLLs durante a execução (o evento AppDomain.AssemblyResolve é acionado porque o CLR não consegue encontrar o arquivo DLL), a DLL necessária é extraída dos recursos embutidos do arquivo EXE.
Você pode ver que o método Attach escuta o evento AppDomain.AssemblyResolve. Quando o CLR falha em carregar um assembly com sucesso, o handler de eventos AssemblyResolve é executado. AssemblyResolve tenta obter o assembly alvo do recurso embutido do assembly carregado via o método Common.ReadFromEmbeddedResources e o retorna ao CLR.
Vendo isso, você pode perguntar: quando foi implementado o método Attach?
Na verdade, para a linguagem C#, o CLR esconde um grande truque – o CLR pode executar algum código inicializado antes de cada módulo (cada conjunto contém um ou mais módulos) ser carregado. Infelizmente, a linguagem C# não tem controle sobre essa parte do código. O Fody.Costura injeta código IL diretamente na função de inicialização do módulo interno do assembly EXE, e essa parte do código IL executa o método Attach. Dessa forma, uma vez que o assembly EXE seja carregado, o método Attach pode ser chamado imediatamente.
O que foi dito acima é uma breve introdução ao princípio de implementação do Fody.Costura.
Configuração avançada
Essas configurações são adicionadas ou modificadas em arquivos CosturaFodyWeavers.xml.
CriarAssembleias Temporárias Padrão: falso Isso incorpora o arquivo incorporado no disco antes de carregá-lo na memória. Isso é útil para certos cenários em que você quer carregar um assembly a partir de um arquivo físico.
Inclui-DeSímbolos Padrão: verdadeiro Determina se os .pdbs do conjunto de referência também estão embeddidos.
DisableCompressão Padrão: falso Assemblies embarcados são comprimidos por padrão e descomprimidos quando carregados. Você pode desativar a compressão usando essa opção. Nota: Certifique-se de desativar essa propriedade ao referenciar DLLs não padrão ou DLLs criptografadas. Caso contrário, isso levará à situação em que o exe não poderá ser aberto. Isso foi descoberto quando eu estava usando DSkin.dll.
DisableCleanup Padrão: falso Como parte do Costura, componentes embutidos não são mais incluídos na build. Essa limpeza pode ser desativada.
LoadAtModuleInit Padrão: verdadeiro O Costura é carregado por padrão como parte da inicialização do módulo. A bandeira desativa o comportamento. Certifique-se de que você pode usar o CosturaUtility.Initialize() em algum lugar.
ExcludeAssemblies Como usar: ExcludeAssemblies="DLL1| DLL2" Uma lista de nomes de assembly para excluir da ação padrão de "incorporar todas as referências locais de cópia".
IncluirAssembleias Como usar: IncludeAssemblies="DLL1| DLL2" Uma lista de nomes de assembly incluída na ação padrão de Incorporar Todas as Referências Locais de Cópia.
Não gerenciado32Assembleias&Unmanaged64Assemblies Como usá-lo: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Assemblies de modo misto não podem ser carregados da mesma forma que assemblies gerenciados. Portanto, para ajudar a Costura a identificar quais componentes estão em modo misto e em quais ambientes carregá-los, seus nomes devem ser incluídos em uma ou ambas as listas. Não inclua .exe ou .dll no nome.
Pré-Ordem de Carga Uso: PreloadOrder="DLL1| DLL2" Bibliotecas locais podem ser carregadas automaticamente pelo Costura. Para incluir uma biblioteca local, inclua-a no seu projeto como um recurso incorporado chamado pasta costura32 ou costura64, dependendo da instabilidade da biblioteca. Alternativamente, você pode especificar a ordem de carregamento em que as bibliotecas pré-carregadas são carregadas. Quando você mistura componentes temporários do disco, eles também são pré-carregados.
CosturaUtility Como usar:
CosturaUtility é uma classe que permite inicializar manualmente o sistema Costura no seu próprio código.Isso é principalmente para cenários em que o programa de inicialização de módulo não funciona, como bibliotecas e Mono.
Por fim, baixe o código-fonte no texto:
Turistas, se quiserem ver o conteúdo oculto deste post, por favor Resposta
|