Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 219600|Risposta: 43

[WinForm] .net/c# Usa Costura.Fody per impacchettare la DLL nell'EXE

[Copiato link]
Pubblicato su 14/04/2018 14:41:49 | | | |
Lo sviluppo Winform/wpf inevitabilmente si riferisce a molte DLL di terze parti, ma ogni volta che lo impaccheti, devi copiare i file nella directory Debug al cliente o condividerli, cosa che non è molto comoda da usare. Ho provato diversi software per unire file dll in passato, come ILMerge, Enigma Virtual Box, ecc., ma finché non ho scoperto "Costura.Fody", sentivo che il mondo era molto migliore~

Di seguito è un programma scritto da Winform, che fa riferimento alle due DLL "HttpHelper.dll" e "Newtonsoft.Json.dll"; quando generiamo il programma, ci sarà un file exe e questi due file DLL, il che mette a disagio le persone, e se c'è una DLL in meno, il programma può segnalare un'eccezione, come mostrato nella figura sottostante:



Il link qui sotto riporta l'uso precedente (non consigliato)

C# impacchettando il dll nel programma dell'exe
http://www.itsvse.com/thread-2841-1-1.html
(Fonte: Architect_Programmer)



Usando lo strumento Costura.Fody, puoi unire la DLL sorgente nell'EXE target

Homepage del progetto: https://github.com/Fody/Costura

Come usare, installare direttamente il pacchetto Nuget:



Una volta che hai aggiunto con successo Costura.Fody, la soluzione aggiungerà automaticamente FodyWeavers.xml file.

Rigenerando la soluzione, puoi vedere il tuo successo nella directory di generazione del programma, tutte le DLL sono perfettamente integrate nell'exe, puoi copiare direttamente il file exe sul client per farlo eseguire indipendentemente. Come mostrato di seguito:

1>------ Tutte le ricostruzioni sono state avviate: Progetto: itsvse, Configurazione: Debug Qualsiasi CPU ------
1> Fody: Fody (versione 2.0.0.0) In esecuzione
1> Fody/Costura: Nessun riferimento a 'Costura.dll'. Riferimenti non modificati.
1> Fody/Costura: Incorporare 'E:\project\itsvse\itsvse\HttpHelper.dll'
1> Fody/Costura: Incorporare 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll'
1> Fody: Finito Fody 609ms.
1> Fody: Ho saltato l'assembly di verifica poiché è disabilitato nella configurazione
1> Fody: Verifica finita in 3ms.
1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe
========== Rigenera tutti: 1 ha successo, 0 fallisce e 0 ========== saltato





Come si può vedere dall'immagine sopra, il file generato non contiene Newtonsoft.Json.dll, HttpHelper.dll e Costura.dll non vengono generati, solo due file, itsvse.exe possono essere eseguiti direttamente senza errori! (Il file PDB può essere eliminato).

Usiamo lo strumento ILSpy per decompilare il nostro programma e diamo un'occhiata al codice sorgente generato, come mostrato nella figura sottostante:



Introduzione al principio di implementazione

Quando il CLR tenta di caricare un assembly ma non riesce a caricare, genera l'evento AppDomain.AssemblyResolve. Il nostro programma può ascoltare questo evento e restituire l'assembly che il CLR sta cercando di caricare nel gestore di eventi affinché il programma possa continuare a funzionare normalmente.

Fody.Costura incorpora tutte le DLL citate dall'EXE nel file EXE durante la costruzione del progetto. Quando un programma utilizza una di queste DLL durante l'esecuzione (l'evento AppDomain.AssemblyResolve viene attivato perché il CLR non riesce a trovare il file DLL), la DLL richiesta viene estratta dalle risorse incorporate del file EXE.


Puoi vedere che il metodo Attach ascolta l'evento AppDomain.AssemblyResolve. Quando il CLR non carica con successo un assembly, viene eseguito il gestore di eventi AssemblyResolve. AssemblyResolve tenta di ottenere l'assembly target dalla risorsa embedded dell'assembly caricato tramite il metodo Common.ReadFromEmbeddedResources e lo restituisce al CLR.

Vedendo questo, potreste chiedervi: quando è stato implementato il metodo Attach?

In effetti, per il linguaggio C#, il CLR nasconde un grande trucco: può eseguire un codice inizializzato prima che ogni modulo (ogni assembly contiene uno o più moduli) venga caricato. Purtroppo, il linguaggio C# non ha controllo su questa parte del codice. Fody.Costura inietta codice IL direttamente nella funzione di inizializzazione del modulo interno dell'assembly EXE, e questa parte del codice IL esegue effettivamente il metodo Attach. In questo modo, una volta caricato l'assembly EXE, il metodo Attach può essere chiamato immediatamente.

Quanto sopra è una breve introduzione al principio di implementazione di Fody.Costura.


Configurazione avanzata

Queste configurazioni vengono aggiunte o modificate in CosturaFodyWeavers.xml file.

CreateTemporaryAssemblies
Predefinito: falso
Questo incorpora il file incorporato nel disco prima di caricarlo in memoria. Questo è utile in certi scenari in cui vuoi caricare un assembly da un file fisico.

IncludeDebugSymbols
Predefinito: vero
Controlla se anche i .pdbs dell'assemblaggio di riferimento sono incorporati.

Disabilitcompressione
Predefinito: falso
Gli assemblaggi embedded vengono compressi di default e non compressi quando caricati. Puoi disattivare la compressione usando questa opzione.
Nota: Assicurati di disattivare questa proprietà quando si fanno riferimento a DLL non standard o a DLL cifrate. Altrimenti, questo porterà alla situazione in cui l'exe non può essere aperto. Questo è stato scoperto mentre usavo DSkin.dll.

DisableCleanup
Predefinito: falso
Come parte di Costura, i componenti embedded non sono più inclusi nella build. Questa pulizia può essere disattivata.

LoadAtModuleInit
Predefinito: vero
Costura viene caricato di default come parte dell'inizializzazione del modulo. La bandiera disabilita il comportamento. Assicurati di poter usare CosturaUtility.Initialize() da qualche parte.

Escludere le Assemblee
Come utilizzare: ExcludeAssemblies="DLL1| DLL2"
Una lista di nomi assembly da escludere dall'azione predefinita di "incorporare tutte le copie di riferimenti locali".

IncludeAssemblies
Come utilizzare: IncludeAssemblies="DLL1| DLL2"
Un elenco dei nomi assembly inclusi nell'azione predefinita di Incorporare tutte le copie di riferimenti locali.

Non gestite32Assemblee&Non gestite64Assemblee
Come usarlo: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2"
Gli assembly a modalità mista non possono essere caricati nello stesso modo degli assembly gestiti. Pertanto, per aiutare Costura a identificare quali componenti sono in modalità mista e in quali ambienti caricarli, i loro nomi dovrebbero essere inclusi in una o entrambe le liste. Non includere .exe o .dll nel nome.

Preload Order
Utilizzo: PreloadOrder="DLL1| DLL2"
Le librerie locali possono essere caricate automaticamente da Costura. Per includere una libreria locale, inserila nel tuo progetto come risorsa incorporata chiamata folder costura32 o costura64 a seconda dell'instabilità della libreria. In alternativa, puoi specificare l'ordine di caricamento in cui vengono caricate le librerie precaricate. Quando si mescolano componenti temporanei dal disco, anche questi sono precaricati.

CosturaUtility
Come utilizzare:




CosturaUtility è una classe che permette di inizializzare manualmente il sistema Costura nel proprio codice.Questo è principalmente per scenari in cui il programma di inizializzazione del modulo non funziona, come le biblioteche e il Mono.


Infine, scarica il codice sorgente nel testo:

Turisti, se volete vedere il contenuto nascosto di questo post, vi pregoRisposta





Precedente:Soluzione StreamReader per caratteri distorti durante la lettura di file
Prossimo:Soluzioni ai conflitti tra Hyper-V, VirtualBox e VMware
Pubblicato su 07/06/2018 09:35:19 |
Prova questo metodo per integrare il componente di dipendenza Dll in un exex compilato in C#!

Se è facile da usare, ricordati di lodarlo! Ahah, questo, basta aggiungere Dll al file di risorse, semplice e pratico! (Non capisco, posso inventarmi un tutorial) @小渣渣

 Padrone di casa| Pubblicato su 06/06/2018 10:30:42 |
Se firmi un programma, riceverai il seguente errore:

1>MSBUILD : errore : Fody: Si è verificata un'eccezione non gestita:
1>MSBUILD : errore : Eccezione:
1>MSBUILD: errore: Impossibile ottenere una chiave pubblica per StrongNameKeyPair.
1>MSBUILD : errore : StackTrace:
1>MSBUILD: errore: at System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: errore: in System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: errore: in Mono.Cecil.ModuleWriter.WriteModuleTo(moduloDefinizione, flusso Disposable'1, parametri WriterParameters)
1>MSBUILD: errore: in Mono.Cecil.ModuleDefinition.Write(StringFileName, WriterParameters parameters)
1>MSBUILD: errore: In InnerWeaver.WriteModule() posizione C:\projects\fody\FodyIsolated\ModuleWriter.cs: riga numero 18
1>MSBUILD: errore: In InnerWeaver.Execute() posizione C:\projects\fody\FodyIsolated\InnerWeaver.cs: numero riga 86
1>MSBUILD : errore : Fonte:
1>MSBUILD : errore : mscorlib
1>MSBUILD : errore : TargetSite:
1>MSBUILD : errore : Byte[] ComputePublicKey()
1>MSBUILD : errore :
1> Fody: Finito Fody 551ms.


Non sembra esserci una soluzione, si veda l'articolo:

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

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


Non affidarti a nomi forti per restare al sicuro.

Quindi sembra inutile fare un passo in più per proteggere qualcosa che non è una funzione di sicurezza

 Padrone di casa| Pubblicato su 17/04/2018 13:02:12 |
xxhh Pubblicato il 17-04-2018 alle 23:35
Dopo aver installato Costura.Fody direttamente in rispetto a NuGet, ho trascinato un lettore Windows Media Playe per generare due dll integrate da cancellare o segnalare...

I controlli di Windows Media Player sono componenti di comunicazione, non so se "Costura.Fody" li supporti.

1: Dovresti verificare se "Costura.Fody" supporta "com components"
2: Ignorare le due DLL che sono confezionate; per quanto riguarda come ignorare l'xml, si prega di consultare la documentazione ufficiale per i dettagli
Pubblicato su 17/04/2018 10:29:52 |
Scarica per vedere la configurazione XML
Pubblicato su 17/04/2018 10:33:34 |
Il proprietario vuole chiederti se posso mettere insieme il video e il dll in un plugin exe
 Padrone di casa| Pubblicato su 17/04/2018 11:16:15 |
xxhh Pubblicato il 17-04-2018 alle 10:33
Il proprietario vuole chiederti se posso mettere insieme il video e il dll in un plugin exe
...

Puoi farlo, puoi impostare la proprietà video su "Risorse Incorporate" e poi leggere il file risorsa.
Pubblicato su 17/04/2018 11:35:51 |
Xiao Zhao ha postato il 17-04-2018 alle 11:16
Puoi farlo, puoi impostare la proprietà video su "Risorse Incorporate" e poi leggere il file risorsa. ...

Ho trascinato un lettore Windows Media Playe direttamente dopo aver installato Costura.Fody in vs NuGet e ho prodotto due DLL integrate per eliminare o segnalare un errore  
Pubblicato su 17/04/2018 11:57:09 |
È ancora necessario impostare XML?     
Pubblicato su 17/04/2018 17:42:31 |
Xiao Zhao ha postato il 17-04-2018 alle 11:16
Puoi farlo, puoi impostare la proprietà video su "Risorse Incorporate" e poi leggere il file risorsa. ...

Proprietario o me, vorrei chiedere, inserisco il video nella risorsa incorporata, quello che viene visualizzato è un array di byte, c'è un modo per inserirlo nel lettore e farlo riprodurre direttamente (non voglio scrivere al locale per riprodurre nel percorso di lettura, il video è più di una scheda grande)
 Padrone di casa| Pubblicato su 17/04/2018 20:52:16 |
xxhh Pubblicato il 17-04-2018 17:42
Proprietario o me, vorrei chiedere, ho inserito il video nella risorsa incorporata, e quello che viene visualizzato è un array di byte, c'è un modo per inserirlo nel lettore e riprodurlo direttamente ( ...

Non è consigliato trasformare un video grande in un file risorsa, puoi vedere se c'è qualche altro modo per far passare direttamente il lettore in byte[]
Pubblicato su 18/04/2018 08:08:48 |
Xiao Zhazha Pubblicato il 17-04-2018 20:52
Non è consigliato trasformare un video grande in un file risorsa, puoi vedere se c'è qualche altro modo per far passare direttamente il lettore in byte[] ...

Nessuno di loro legge gli indirizzi video e vuole chiederti quali buone idee hai
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com