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)
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 prego Risposta
|