Razvoj Winform/wpf neizogibno vključuje veliko DLL-jev tretjih oseb, vendar morate vsakič, ko jih zapakirate, datoteke iz mape Debug kopirati stranki ali jih deliti, kar ni ravno priročno za uporabo. Preizkusil sem že več programov za združevanje dll datotek, kot so ILMerge, Enigma Virtual Box itd., a dokler nisem izvedel za "Costura.Fody", sem imel občutek, da je svet veliko boljši~
Sledi program, ki ga je napisal Winform, pri čemer se sklicuje na dva DLL-ja "HttpHelper.dll" in "Newtonsoft.Json.dll". Ko generiramo program, bo na voljo exe datoteka in ti dve DLL datoteki, kar ljudem povzroča veliko nelagodje, in če je en DLL manj, lahko program prijavi izjemo, kot je prikazano na spodnji sliki:
Spodnja povezava prikazuje prejšnjo uporabo (ni priporočljivo)
Z orodjem Costura.Fody lahko izvorni DLL združiš v ciljni EXE
Domača stran projekta: https://github.com/Fody/Costura
Kako uporabljati, neposredno namestiti paket Nuget:
Ko uspešno dodate Costura.Fody, bo rešitev samodejno dodala FodyWeavers.xml datoteko.
Ponovno generiraj rešitev, uspeh vidiš v mapi za generiranje programov, vsi DLL-ji so popolnoma združeni v exe, lahko pa neposredno kopiraš exe datoteko v odjemalca, da teče neodvisno. Kot je prikazano spodaj:
1>------ Vse obnove so začete: Project: itsvse, Configuration: Debug Any CPU ------ 1> Fody: Fody (različica 2.0.0.0) Izvajanje 1> Fody/Costura: Ni bilo najdenih omemb 'Costura.dll'. Reference niso spremenjene. 1> Fody/Costura: Namestitev 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Vgradnja 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Dokončal sem Fody 609ms. 1> Fody: Preskočil sem preverjanje sestave, ker je onemogočen v konfiguraciji 1> Fody: Preverjanje končano v 3ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regeneriraj vse: 1 uspe, 0 ne uspe in 0 ========== preskoči
Kot je razvidno iz zgornje slike, ustvarjena datoteka ne vsebuje Newtonsoft.Json.dll, HttpHelper.dll in Costura.dll nista ustvarjeni, temveč le dve datoteki, itsvse.exe se lahko zaženeta neposredno brez napak! (Datoteko PDB je mogoče izbrisati).
Uporabimo orodje ILSpy za dekompilacijo našega programa in si oglejmo generirano izvorno kodo, kot je prikazano na spodnji sliki:
Uvod v načelo implementacije
Ko CLR poskuša naložiti asembler, vendar ga ne naloži, sproži dogodek AppDomain.AssemblyResolve. Naš program lahko posluša ta dogodek in vrne sestavo, ki jo CLR poskuša naložiti v obravnavalnik dogodkov, da program lahko nadaljuje z normalnim delovanjem.
Fody.Costura vgradi vse DLL-je, na katere se sklicuje EXE, v datoteko EXE pri gradnji projekta. Ko program med izvajanjem uporabi enega od teh DLL-jev (dogodek AppDomain.AssemblyResolve se sproži, ker CLR ne najde DLL datoteke), se zahtevani DLL izvleče iz vgrajenih virov EXE datoteke.
Lahko vidite, da metoda Attach posluša dogodek AppDomain.AssemblyResolve. Ko CLR ne naloži asemblerja uspešno, se izvede obravnava dogodkov AssemblyResolve. AssemblyResolve poskuša pridobiti ciljno sestavo iz vgrajenega vira naloženega sklopa preko metode Common.ReadFromEmbeddedResources in jo vrne v CLR.
Ob tem se morda vprašate, kdaj je bila uvedena metoda Pritrditi?
Pravzaprav CLR za jezik C# skriva velik trik – CLR lahko izvede nekaj inicializirane kode, preden se naloži vsak modul (vsak asembler vsebuje enega ali več modulov). Na žalost jezik C# nima nadzora nad tem delom kode. Fody.Costura neposredno vbrizga IL kodo v inicializacijsko funkcijo notranjega modula EXE sestave, ta del IL kode pa dejansko izvaja metodo Pridih. Na ta način, ko je EXE sklop naložen, lahko takoj pokličemo metodo Pritrditi.
Zgornje je kratek uvod v implementacijsko načelo Fody.Costura.
Napredna konfiguracija
Te konfiguracije se dodajajo ali spreminjajo v CosturaFodyWeavers.xml datotekah.
CreateTemporaryAssemblies Privzeto: napačno To vgradi vgrajeno datoteko na disk, preden jo naloži v pomnilnik. To je uporabno v določenih primerih, ko želite naložiti sestavljeno datoteko iz fizične datoteke.
IncludeDebugSymbols Privzeto: resnično Nadzoruje, ali so .pdbs referenčnega sklopa prav tako vgrajeni.
DisableCompression Privzeto: napačno Vgrajene sestave so privzeto stisnjene in ob nalaganju nekompresirane. Kompresijo lahko izklopite s to možnostjo. Opomba: Obvezno izklopite to lastnost, ko se sklicujete na nestandardne DLL-je ali šifrirane DLL-je. V nasprotnem primeru bo prišlo do situacije, ko exe datoteke ni mogoče odpreti. To so odkrili, ko sem uporabljal DSkin.dll.
OnemogočiČiščenje Privzeto: napačno Kot del Costure vgrajene komponente niso več vključene v različico. To čiščenje je mogoče izklopiti.
LoadAtModuleInit Privzeto: resnično Costura se privzeto naloži kot del inicializacije modula. Zastavica onemogoči to vedenje. Prepričaj se, da lahko nekje uporabiš CosturaUtility.Initialize().
IzključiteAssemblies Kako uporabljati: ExcludeAssemblies="DLL1| DLL2" Seznam asemblerjev, ki jih je treba izključiti iz privzete akcije "vgradi vse lokalne reference kopiranja".
IncludeAssemblies Kako uporabljati: IncludeAssemblies="DLL1| DLL2" Seznam imen asemblerjev, vključenih v privzeto dejanje vdelave vseh lokalnih referenc za kopiranje.
Unmanaged32Assemblies&Unmanaged64Assemblies Kako ga uporabljati: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Mešanih načinov sestav ni mogoče naložiti na enak način kot upravljanih sestav. Zato, da bi Costura lažje prepoznala, katere komponente so v mešanem načinu in v katerih okoljih jih naložiti, bi morala biti njihova imena vključena v enega ali oba seznama. V ime ne vključujte .exe ali .dll.
Vrstni red prednalaganja Uporaba: PreloadOrder="DLL1| DLL2" Lokalne knjižnice lahko Costura samodejno naloži. Če želite vključiti lokalno knjižnico, jo vključite v svoj projekt kot vgrajen vir, imenovan mapa costura32 ali costura64, odvisno od nestabilnosti knjižnice. Alternativno lahko določite vrstni red nalaganja, v katerem so prednaložene knjižnice nalagane. Ko mešate začasne komponente z diska, so tudi te vnaprej naložene.
CosturaUtility Kako uporabljati:
CosturaUtility je razred, ki vam omogoča ročno inicializacijo sistema Costura v lastni kodi.To velja predvsem za primere, ko program inicializacije modula ne deluje, kot so knjižnice in Mono.
Na koncu prenesite izvorno kodo v besedilu:
Turisti, če želite videti skrito vsebino te objave, prosim Odgovoriti
|