Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 219600|Resposta: 43

[WinForm] .net/c# Use o Costura.Fody para empacotar a DLL no EXE

[Copiar link]
Publicado em 14/04/2018 14:41:49 | | | |
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)

C# empacota a dll no programa do exe
http://www.itsvse.com/thread-2841-1-1.html
(Fonte: Architect_Programmer)



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 favorResposta





Anterior:Solução StreamReader para caracteres distorsionados ao ler arquivos
Próximo:Soluções para conflitos entre Hyper-V, VirtualBox e VMware
Publicado em 07/06/2018 09:35:19 |
Tente este método sobre integrar o componente de dependência Dll em um EXE compilado em C#!

Se for fácil de usar, lembre-se de elogiá-lo! Haha, isso, é só adicionar o DLL ao arquivo de recursos, simples e prático! (Não entendo, posso inventar um tutorial) @小渣渣

 Senhorio| Publicado em 06/06/2018 10:30:42 |
Se você assinar um programa, receberá o seguinte erro:

1>MSBUILD : erro : Fody: Ocorreu uma exceção não tratada:
1>MSBUILD : erro : Exceção:
1>MSBUILD: erro: Não foi possível obter uma chave pública para o StrongNameKeyPair.
1>MSBUILD : erro : StackTrace:
1>MSBUILD: erro: em System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: erro: em System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: erro: em Mono.Cecil.ModuleWriter.WriteModuleTo(módulo ModuleDefinition, fluxo Disposable'1, parâmetros WriterPares)
1>MSBUILD: erro: em Mono.Cecil.ModuleDefinition.Write(String fileName, parâmetros WriterPares)
1>MSBUILD: erro: In InnerWeaver.WriteModule() posição C:\projects\fody\FodyIsolated\ModuleWriter.cs: linha número 18
1>MSBUILD: erro: In InnerWeaver.Execute() posição C:\projects\fody\FodyIsolated\InnerWeaver.cs: número da linha 86
1>MSBUILD : erro : Fonte:
1>MSBUILD : erro : mscorlib
1>MSBUILD : erro : TargetSite:
1>MSBUILD : erro : Byte[] ComputePublicKey()
1>MSBUILD : erro :
1> Fody: Finalizei o Fody 551ms.


Parece não haver solução, consulte o artigo:

https://github.com/Fody/ExtraConstraints/issues/5

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


Não confie em nomes fortes para se manter seguro.

Então parece inútil ir além para proteger algo que não é um recurso de segurança

 Senhorio| Publicado em 17/04/2018 13:02:12 |
xxhh Postado em 2018-4-17 11:35
Depois de instalar o Costura.Fody diretamente em vez do NuGet, arraste um player do Windows Media Playe para gerar duas DLLs embutidas para deletar ou reportar ...

Os controles do Windows Media Player são componentes de com, não sei se o "Costura.Fody" os suporta.

1: Você deve verificar se o "Costura.Fody" suporta "com components"
2: Ignore as duas DLLs que estão empacotadas, pois para como ignorar o xml deve ser definido, consulte a documentação oficial para detalhes
Publicado em 17/04/2018 10:29:52 |
Baixe para ver a configuração XML
Publicado em 17/04/2018 10:33:34 |
O dono quer te perguntar se eu consigo colocar o vídeo e o download em um plugin exe
 Senhorio| Publicado em 17/04/2018 11:16:15 |
xxhh Postado em 2018-4-17 às 10:33
O dono quer te perguntar se eu consigo colocar o vídeo e o download em um plugin exe
...

Você pode fazer isso, pode definir a propriedade de vídeo como "Recursos Incorporados" e então ler o arquivo de recursos.
Publicado em 17/04/2018 11:35:51 |
Xiao Zhao postou em 17-04-2018 às 23:16
Você pode fazer isso, pode definir a propriedade de vídeo como "Recursos Incorporados" e então ler o arquivo de recursos. ...

Arrastei um player Windows Media Playe logo após instalar o Costura.Fody em vez do NuGet e criei duas DLLs embutidas para deletar ou reportar um erro  
Publicado em 17/04/2018 11:57:09 |
O XML ainda precisa ser configurado?     
Publicado em 17/04/2018 17:42:31 |
Xiao Zhao postou em 17-04-2018 às 23:16
Você pode fazer isso, pode definir a propriedade de vídeo como "Recursos Incorporados" e então ler o arquivo de recursos. ...

Senhorio ou eu, quero perguntar, eu coloco o vídeo no recurso embutido, o que lê é um array de bytes, existe alguma forma de colocá-lo no player e reproduzi-lo diretamente (não quero escrever para o local para reproduzir no caminho de leitura, o vídeo é mais do que o cartão grande)
 Senhorio| Publicado em 17/04/2018 20:52:16 |
xxhh Postado em 2018-4-17 17:42
Senhorio ou eu, quero perguntar, eu coloco o vídeo no recurso embutido, e o que aparece é um array de bytes, existe alguma forma de colocá-lo no player e reproduzi-lo diretamente ( ...

Não é recomendado transformar um vídeo grande em um arquivo de recurso, você pode ver se há alguma outra forma do player passar diretamente para o byte[]
Publicado em 18/04/2018 08:08:48 |
Xiao Zhazha Postado em 17-04-2018 20:52
Não é recomendado transformar um vídeo grande em um arquivo de recurso, você pode ver se há alguma outra forma de o player passar diretamente para o byte[] ...

Nenhum deles lê endereços em vídeo e quer perguntar quais boas ideias você tem
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com