Dezvoltarea Winform/wpf se referă inevitabil la multe DLL-uri terțe, dar de fiecare dată când le împachetezi, trebuie să copiezi fișierele din directorul Debug către client sau să le distribui, ceea ce nu este foarte convenabil de folosit. Am încercat mai multe programe pentru a fuziona fișierele dll înainte, cum ar fi ILMerge, Enigma Virtual Box etc., dar până am aflat despre "Costura.Fody", simțeam că lumea era mult mai bună~
Următorul este un program scris de Winform, care face referire la cele două DLL-uri "HttpHelper.dll" și "Newtonsoft.Json.dll", când generăm programul, va exista un fișier exe și aceste două fișiere DLL, ceea ce îi face pe oameni să se simtă foarte inconfortabil, iar dacă există un DLL mai puțin, programul poate raporta o excepție, așa cum se arată în figura de mai jos:
Linkul de mai jos arată utilizarea anterioară (nu este recomandat)
Folosind instrumentul Costura.Fody, poți combina DLL-ul sursă în EXE țintă
Pagina principală a proiectului: https://github.com/Fody/Costura
Cum să folosești și să instalezi direct pachetul Nuget:
Odată ce ai adăugat cu succes Costura.Fody, soluția va adăuga automat FodyWeavers.xml fișier.
Regenerează soluția, poți vedea succesul în directorul de generare a programului, toate DLL-urile sunt perfect îmbinate în exe, poți copia direct fișierul exe pe client pentru a rula independent. Așa cum se arată mai jos:
1>------ Toate reconstrucțiile au fost începute: Proiect: itsvse, Configurare: Depanare Orice CPU ------ 1> Fody: Fody (versiunea 2.0.0.0) Executare 1> Fody/Costura: Nu s-a găsit nicio referință la "Costura.dll". Referințe nemodificate. 1> Fody/Costura: Încorporarea 'E:\proiect\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Încorporarea 'E:\proiect\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: A terminat Fody 609ms. 1> Fody: Am sărit peste asamblarea verificării deoarece este dezactivată în configurație 1> Fody: Verificarea a fost finalizată în 3ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regenerează toate: 1 reușește, 0 eșuează și 0 ========== sărite
După cum se poate vedea din imaginea de mai sus, fișierul generat nu conține Newtonsoft.Json.dll, HttpHelper.dll și Costura.dll nu sunt generate, ci doar două fișiere, itsvse.exe pot fi rulate direct fără erori! (Fișierul PDB poate fi șters).
Să folosim instrumentul ILSpy pentru a decompila programul nostru și să aruncăm o privire la codul sursă generat, așa cum este arătat în figura de mai jos:
Introducere în principiul implementării
Când CLR încearcă să încarce o asamblare, dar nu reușește, generează evenimentul AppDomain.AssemblyResolve. Programul nostru poate asculta acest eveniment și poate returna asamblarea pe care CLR-ul încearcă să o încarce în handler-ul de evenimente, astfel încât programul să poată continua să funcționeze normal.
Fody.Costura încorporează toate DLL-urile referențiate de EXE în fișierul EXE atunci când construiește proiectul. Când un program folosește una dintre aceste DLL-uri în timpul execuției (evenimentul AppDomain.AssemblyResolve este declanșat deoarece CLR-ul nu poate găsi fișierul DLL), DLL-ul necesar este extras din resursele încorporate ale fișierului EXE.
Poți vedea că metoda Attach ascultă evenimentul AppDomain.AssemblyResolve. Când CLR-ul nu reușește să încarce cu succes un ansamblu, handler-ul de evenimente AssemblyResolve este executat. AssemblyResolve încearcă să obțină asamblarea țintă din resursa încorporată a ansamblului încărcat prin metoda Common.ReadFromEmbeddedResources și o returnează către CLR.
Văzând asta, poate vă întrebați, când a fost implementată metoda Attach?
De fapt, pentru limbajul C#, CLR ascunde un truc important – poate executa un cod inițializat înainte ca fiecare modul (fiecare ansamblu conține unul sau mai multe module) să fie încărcat. Din păcate, limbajul C# nu are control asupra acestei părți a codului. Fody.Costura injectează cod IL direct în funcția de inițializare a modulului intern al ansamblului EXE, iar această parte a codului IL execută efectiv metoda Attach. Astfel, odată ce ansamblul EXE este încărcat, metoda Attach poate fi apelată imediat.
Mai sus este o scurtă introducere a principiului de implementare al Fody.Costura.
Configurație avansată
Aceste configurații sunt adăugate sau modificate în CosturaFodyWeavers.xml fișiere.
CreeazăAsamblări Temporare Implicit: fals Aceasta încorporează fișierul încorporat pe disc înainte de a-l încărca în memorie. Acest lucru este util pentru anumite scenarii în care vrei să încarci un ansamblu dintr-un fișier fizic.
IncludeDebugSymbols Implicit: adevărat Controlează dacă .pdb-urile ansamblului de referință sunt de asemenea încorporate.
DisableCompression Implicit: fals Ansamblurile încorporate sunt comprimate implicit și decomprimate când sunt încărcate. Poți dezactiva compresia folosind această opțiune. Notă: Asigurați-vă că dezactivați această proprietate atunci când faceți referire la DLL-uri non-standard sau DLL-uri criptate. Altfel, va duce la situația în care exe-ul nu poate fi deschis. Acest lucru a fost descoperit când foloseam DSkin.dll.
DisableCleanup Implicit: fals Ca parte a Costura, componentele încorporate nu mai sunt incluse în construcție. Această curățare poate fi oprită.
LoadAtModuleInit Implicit: adevărat Costura este încărcat implicit ca parte a inițializării modulului. Steagul dezactivează comportamentul. Asigură-te că poți folosi undeva CosturaUtility.Initialize().
ExcludeAssemblies Cum să folosești: ExcludeAssemblies="DLL1| DLL2" O listă de nume de asamblare de exclus din acțiunea implicită "încorporează toate referințele locale copiate".
IncludeAssemblies Cum să folosești: IncludeAssemblies="DLL1| DLL2" O listă de nume de asamblare incluse în acțiunea implicită Embedding All Copy Local References.
Negestionat32Adunări&Negestionat64Adunări Cum să-l folosești: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Ansamblurile mixte nu pot fi încărcate în același mod ca și asamblările gestionate. Prin urmare, pentru a ajuta Costura să identifice care componente sunt în modul mixt și în ce medii să le încarce, numele lor ar trebui incluse în una sau ambele liste. Nu include .exe sau .dll în nume.
PreloadOrder Utilizare: PreloadOrder="DLL1| DLL2" Bibliotecile locale pot fi încărcate automat de Costura. Pentru a include o bibliotecă locală, include-o în proiectul tău ca o resursă încorporată numită folder costura32 sau costura64, în funcție de instabilitatea bibliotecii. Alternativ, poți specifica ordinea de încărcare în care sunt încărcate bibliotecile preîncărcate. Când amesteci componente temporare de pe disc, acestea sunt și ele preîncărcate.
CosturaUtility Cum să folosești:
CosturaUtility este o clasă care îți permite să inițializezi manual sistemul Costura în propriul tău cod.Aceasta este în principal pentru scenarii în care programul de inițializare a modulului nu funcționează, cum ar fi bibliotecile și Mono.
În final, descarcă codul sursă din text:
Turiști, dacă vreți să vedeți conținutul ascuns al acestei postări, vă rog Răspunde
|