Winform/wpf-utvikling refererer uunngåelig til mange tredjeparts DLL-er, men hver gang du pakker den, må du kopiere filene i Debug-katalogen til kunden eller dele dem, noe som ikke er særlig praktisk å bruke. Jeg har prøvd flere programmer for å slå sammen dll-filer før, som ILMerge, Enigma Virtual Box, osv., men før jeg lærte om "Costura.Fody", følte jeg at verden var mye bedre~
Følgende er et program skrevet av Winform, som refererer til de to DLL-ene "HttpHelper.dll" og "Newtonsoft.Json.dll"; når vi genererer programmet, vil det være en exe-fil og disse to DLL-filene, noe som gjør folk veldig ukomfortable, og hvis det er én DLL mindre, kan programmet rapportere et unntak, som vist i figuren under:
Lenken nedenfor viser tidligere bruk (ikke anbefalt)
Ved å bruke verktøyet Costura.Fody kan du slå sammen kilde-DLL-en med mål-EXE-en
Prosjektets hjemmeside: https://github.com/Fody/Costura
Slik bruker du nuget-pakken direkte:
Når du har lagt til Costura.Fody, vil løsningen automatisk legge til FodyWeavers.xml fil.
Regenerer løsningen, du kan se suksessen din i programgenereringskatalogen, alle DLL-ene er perfekt flettet inn i exe-filen, du kan kopiere exe-filen direkte til klienten for å kjøre den uavhengig. Som vist nedenfor:
1>------ Alle ombygginger er startet: Prosjekt: itsvse, Konfigurasjon: Debug Enhver CPU------- 1> Fody: Fody (versjon 2.0.0.0) Kjører 1> Fody/Costura: Ingen referanse til 'Costura.dll' funnet. Referanser ikke endret. 1> Fody/Costura: Innebygd 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Embedding 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Fullførte Fody 609 ms. 1> Fody: Hoppet over Verifying assembly siden den er deaktivert i konfigurasjonen 1> Fody: Fullførte verifiseringen på 3 ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regenerer alle: 1 lykkes, 0 mislykkes, og 0 ========== hoppet over
Som man kan se på bildet over, inneholder ikke den genererte filen Newtonsoft.Json.dll, HttpHelper.dll og Costura.dll genereres ikke, bare to filer, itsvse.exe kan kjøres direkte uten feil! (PDB-filen kan slettes).
La oss bruke ILSpy-verktøyet til å dekompilere programmet vårt og se på den genererte kildekoden, som vist i figuren nedenfor:
Introduksjon til implementeringsprinsippet
Når CLR prøver å laste inn en assembly, men mislykkes, utløser den AppDomain.AssemblyResolve-hendelsen. Programmet vårt kan lytte etter denne hendelsen og returnere assembleren som CLR prøver å laste inn i hendelseshåndtereren, slik at programmet kan fortsette å fungere normalt.
Fody.Costura legger inn alle DLL-ene som refereres til av EXE-en i EXE-filen når prosjektet bygges. Når et program bruker en av disse DLL-ene under kjøring (AppDomain.AssemblyResolve-hendelsen utløses fordi CLR-en ikke finner DLL-filen), blir den nødvendige DLL-en hentet ut fra de innebygde ressursene i EXE-filen.
Du kan se at Attate-metoden lytter til AppDomain.AssemblyResolve-hendelsen. Når CLR ikke klarer å laste inn en assembly, kjøres AssemblyResolve-hendelseshåndtereren. AssemblyResolve forsøker å hente mål-assemblyen fra den lastede assemblyens innebygde ressurs via Common.ReadFromEmbeddedResources-metoden og returnerer den til CLR.
Når du ser dette, kan du spørre: Når ble Atte-metoden implementert?
Faktisk, for C#-språket, skjuler CLR et stort triks – CLR kan kjøre noe initialisert kode før hver modul (hver samling inneholder en eller flere moduler) lastes inn. Dessverre har ikke C#-språket kontroll over denne delen av koden. Fody.Costura injiserer IL-kode direkte inn i initialiseringsfunksjonen til den interne modulen i EXE-assemblyen, og denne delen av IL-koden utfører faktisk Attach-metoden. På denne måten, når EXE-enheten er lastet inn, kan Attac-metoden kalles umiddelbart.
Ovenfor er en kort introduksjon til implementeringsprinsippet i Fody.Costura.
Avansert konfigurasjon
Disse konfigurasjonene legges til eller endres i CosturaFodyWeavers.xml filer.
CreateTemporaryAssemblies Standard: falsk Dette legger inn den innebygde filen på disken før den lastes inn i minnet. Dette er nyttig i visse situasjoner hvor du vil laste inn en assembly fra en fysisk fil.
IncludeDebugSymbols Standard: sann Kontrollerer om .pdb-ene til referansesamlingen også er innebygd.
Deaktiverekompresjon Standard: falsk Innebygde sammenstillinger komprimeres som standard og ikke komprimeres når de lastes. Du kan slå av komprimering ved å bruke dette alternativet. Merk: Husk å slå av denne egenskapen når du refererer til ikke-standard DLL-er, eller krypterte DLL-er. Ellers vil det føre til at exe-filen ikke kan åpnes. Dette oppdaget jeg da jeg brukte DSkin.dll.
DisableCleanup Standard: falsk Som en del av Costura er ikke lenger innebygde komponenter inkludert i bygget. Denne oppryddingen kan slås av.
LoadAtModuleInit Standard: sann Costura lastes som standard som en del av modulinitialisering. Flagget deaktiverer oppførselen. Sørg for at du kan bruke CosturaUtility. Initialize() et sted.
EksklusjonForsamlinger Hvordan bruke: ExcludeAssemblies="DLL1| DLL2" En liste over assemblernavn som skal utelukkes fra standardhandlingen "legg inn alle lokale referanser".
Inkludere forsamlinger Hvordan bruke: IncludeAssemblies="DLL1| DLL2" En liste over assemblernavn inkludert i standardhandlingen Embedding All Copy Local References.
Unmanaged32Assemblies&Unmanaged64Assemblies Hvordan bruke den: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Mixed-mode assemblies kan ikke lastes inn på samme måte som administrerte assemblies. Derfor, for å hjelpe Costura med å identifisere hvilke komponenter som er i blandet modus, og i hvilke miljøer de skal lastes inn, bør navnene deres inkluderes i en eller begge listene. Ikke inkluder .exe eller .dll i navnet.
PreloadOrder Bruk: PreloadOrder="DLL1| DLL2" Lokale biblioteker kan automatisk lastes inn av Costura. For å inkludere et lokalt bibliotek, inkluder det i prosjektet ditt som en innebygd ressurs kalt en mappe costura32 eller costura64, avhengig av bibliotekets ustabilitet. Alternativt kan du spesifisere lasterekkefølgen som de forhåndslastede bibliotekene lastes inn i. Når du blander midlertidige komponenter fra disken, er de også forhåndslastet.
CosturaUtility Slik bruker du:
CosturaUtility er en klasse som lar deg manuelt initialisere Costura-systemet i din egen kode.Dette gjelder hovedsakelig scenarier der modulinitialiseringsprogrammet ikke fungerer, som biblioteker og Mono.
Til slutt, last ned kildekoden i teksten:
Turister, hvis dere vil se det skjulte innholdet i dette innlegget, vær så snill Svare
|