Winform/wpf-udvikling refererer uundgåeligt til mange tredjeparts DLL'er, men hver gang du pakker det, skal du kopiere filerne i Debug-mappen til kunden eller dele dem, hvilket ikke er særlig praktisk at bruge. Jeg har prøvet flere programmer til at merge dll-filer før, såsom ILMerge, Enigma Virtual Box osv., men indtil jeg lærte om "Costura.Fody", følte jeg, at verden var meget bedre~
Følgende er et program skrevet af Winform, der refererer til de to DLL'er "HttpHelper.dll" og "Newtonsoft.Json.dll"; når vi genererer programmet, vil der være en exe-fil og disse to DLL-filer, hvilket gør folk meget utilpasse, og hvis der er én DLL mindre, kan programmet rapportere en undtagelse, som vist i figuren nedenfor:
Linket nedenfor viser den tidligere brug (ikke anbefalet)
Ved at bruge Costura.Fody-værktøjet kan du merge kilde-DLL'en ind i mål-EXE'en
Projekthjemmeside: https://github.com/Fody/Costura
Sådan bruger du nuget-pakken direkte og installerer:
Når du har tilføjet Costura.Fody med succes, vil løsningen automatisk tilføje FodyWeavers.xml fil.
Gengenerer løsningen, du kan se din succes i programgenereringsmappen, alle DLL'erne er perfekt flettet ind i exe'en, du kan direkte kopiere exe-filen til klienten for at køre den uafhængigt. Som vist nedenfor:
1>------ Alle genopbygninger er startet: Projekt: itsvse, Konfiguration: Debug enhver CPU ------ 1> Fody: Fody (version 2.0.0.0) Udfører 1> Fody/Costura: Ingen reference til 'Costura.dll' fundet. Referencer ikke ændret. 1> Fody/Costura: Indlejring af 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Indlejring af 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Færdiggjorde Fody 609ms. 1> Fody: Sprung Verificering af assembly over, da den er deaktiveret i konfigurationen 1> Fody: Færdig med verifikationen på 3 ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regenerer alle: 1 lykkes, 0 fejler, og 0 ========== springer over
Som det kan ses på billedet ovenfor, indeholder den genererede fil ikke Newtonsoft.Json.dll, HttpHelper.dll og Costura.dll er ikke genereret, kun to filer, itsvse.exe kan køres direkte uden fejl! (PDB-filen kan slettes).
Lad os bruge ILSpy-værktøjet til at dekompilere vores program og se på den genererede kildekode, som vist i figuren nedenfor:
Introduktion til implementeringsprincippet
Når CLR forsøger at indlæse en assembly, men fejler i at indlæse, åbner den AppDomain.AssemblyResolve-hændelsen. Vores program kan lytte efter denne begivenhed og returnere den assembly, som CLR'en forsøger at indlæse i event handleren, så programmet kan fortsætte med at fungere normalt.
Fody.Costura indlejrer alle DLL'erne, som EXE'en refererer til, i EXE-filen, når projektet bygges. Når et program bruger en af disse DLL'er under udførelsen (AppDomain.AssemblyResolve-begivenheden udløses, fordi CLR ikke kan finde DLL-filen), udtrækkes den nødvendige DLL fra de indlejrede ressourcer i EXE-filen.
Du kan se, at Attacte-metoden lytter til AppDomain.AssemblyResolve-begivenheden. Når CLR ikke indlæser en assembly korrekt, udføres AssemblyResolve-hændelseshåndteren. AssemblyResolve forsøger at hente målsamlingen fra den indlæste assemblys indlejrede ressource via Common.ReadFromEmbeddedResources-metoden og returnerer den til CLR.
Når du ser dette, spørger du måske, hvornår blev Atte-metoden implementeret?
Faktisk skjuler CLR for C#-sproget et stort trick – CLR kan køre noget initialiseret kode, før hvert modul (hver assembly indeholder en eller flere moduler) indlæses. Desværre har C#-sproget ingen kontrol over denne del af koden. Fody.Costura indsætter IL-kode direkte i initialiseringsfunktionen af det interne modul i EXE-samlingen, og denne del af IL-koden udfører faktisk Attach-metoden. På denne måde kan Atte-metoden kaldes med det samme, når EXE-samlingen er indlæst.
Ovenstående er en kort introduktion til implementeringsprincippet i Fody.Costura.
Avanceret konfiguration
Disse konfigurationer tilføjes eller ændres i CosturaFodyWeavers.xml filer.
CreateTemporaryAssemblies Standard: falsk Dette indlejrer den indlejrede fil i disken, før den indlæses i hukommelsen. Dette er nyttigt i visse situationer, hvor du vil indlæse en assembly fra en fysisk fil.
IncludeDebugSymbols Standard: sandt Styrer, om .pdb'erne i referencesamlingen også er indlejret.
DisableKompression Standard: falsk Indlejrede samlinger komprimeres som standard og ikke komprimeres, når de indlæses. Du kan slå kompression fra ved at bruge denne mulighed. Bemærk: Sørg for at slå denne egenskab fra, når du refererer til ikke-standard DLL'er eller krypterede DLL'er. Ellers vil det føre til, at exe-filen ikke kan åbnes. Det blev opdaget, da jeg brugte DSkin.dll.
DisableCleanup Standard: falsk Som en del af Costura er indlejrede komponenter ikke længere inkluderet i buildet. Denne oprydning kan slås fra.
LoadAtModuleInit Standard: sandt Costura indlæses som standard som en del af module-initialiseringen. Flaget deaktiverer adfærden. Sørg for, at du kan bruge CosturaUtility. Initialize() et sted.
EksklusiveForsamlinger Sådan bruger du: ExcludeAssemblies="DLL1| DLL2" En liste over assemblynavne, der skal udelukkes fra standardhandlingen "indlejr alle lokale referencer".
InkludérForsamlinger Sådan bruger du: IncludeAssemblies="DLL1| DLL2" En liste over assemblynavne inkluderet i standardhandlingen Embedding All Copy Local References.
Unmanaged32Assemblies&Unmanaged64Assemblies Sådan bruger du det: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Mixed-mode assemblies kan ikke indlæses på samme måde som managed assemblies. Derfor bør deres navne inkluderes i en eller begge lister for at hjælpe Costura med at identificere, hvilke komponenter der er i blandet tilstand, og i hvilke miljøer de skal indlæses. Inkluder ikke .exe eller .dll i navnet.
PreloadOrder Brug: PreloadOrder="DLL1| DLL2" Lokale biblioteker kan automatisk indlæses af Costura. For at inkludere et lokalt bibliotek, inkluder det i dit projekt som en indlejret ressource kaldet en mappe costura32 eller costura64, afhængigt af bibliotekets ustabilitet. Alternativt kan du angive den rækkefølge, hvori de forudindlæste biblioteker indlæses. Når du blander midlertidige komponenter fra disken, bliver de også forudindlæst.
CosturaUtility Sådan bruger du:
CosturaUtility er en klasse, der giver dig mulighed for manuelt at initialisere Costura-systemet i din egen kode.Dette gælder primært for scenarier, hvor modulinitialiseringsprogrammet ikke virker, såsom biblioteker og Mono.
Endelig downloader du kildekoden i teksten:
Turister, hvis I vil se det skjulte indhold i dette indlæg, så vær venlig Svar
|