Winform/wpf kūrimas neišvengiamai nurodo daugelį trečiųjų šalių DLL, tačiau kiekvieną kartą, kai jį supakuojate, turite nukopijuoti failus iš Debug katalogo klientui arba jais pasidalinti, o tai nėra labai patogu naudoti. Aš bandžiau keletą programinės įrangos sujungti dll failus prieš, pavyzdžiui, ILMerge, Enigma Virtual Box, ir tt, bet kol aš sužinojau apie "Costura.Fody", aš jaučiau, kad pasaulis buvo daug geresnis ~
Toliau pateikiama "Winform" parašyta programa, nurodanti du DLL "HttpHelper.dll" ir "Newtonsoft.Json.dll", kai sugeneruosime programą, bus exe failas ir šie du DLL failai, dėl kurių žmonės jaučiasi labai nepatogiai, o jei yra vienu DLL mažiau, programa gali pranešti apie išimtį, kaip parodyta paveikslėlyje žemiau:
Toliau pateikta nuoroda yra ankstesnis naudojimas (nerekomenduojama)
Naudodami "Costura.Fody" įrankį galite sujungti šaltinio DLL į tikslinį EXE
Projekto tinklalapis: https://github.com/Fody/Costura
Kaip naudoti, tiesiogiai įdiekite nuget paketą:
Sėkmingai pridėjus Costura.Fody, sprendimas automatiškai pridės FodyWeavers.xml failą.
Iš naujo sukurkite sprendimą, galite pamatyti savo sėkmę programos generavimo kataloge, visi DLL yra puikiai sujungti į exe, galite tiesiogiai nukopijuoti exe failą į klientą, kad jis veiktų savarankiškai. Kaip parodyta žemiau:
1>------ Visi atkūrimai buvo pradėti: Projektas: itsvse, Konfigūracija: Derinkite bet kokį procesorių ------ 1> Fody: Fody (versija 2.0.0.0) vykdoma 1> Fody/Costura: nuorodos į "Costura.dll" nerasta. Nuorodos nemodifikuotos. 1> Fody/Costura: įterpimas "E:\project\itsvse\itsvse\HttpHelper.dll" 1> Fody/Costura: įterpimas "E:\project\itsvse\itsvse\Newtonsoft.Json.dll" 1> Fody: baigtas Fody 609ms. 1> Fody: praleistas surinkimo tikrinimas, nes jis išjungtas konfigūracijoje 1> Fody: patikrinimas baigtas per 3 ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Atkurti viską: 1 pavyksta, 0 nepavyksta, o 0 ========== praleistas
Kaip matyti iš aukščiau pateikto paveikslėlio, sugeneruotame faile nėra Newtonsoft.Json.dll, HttpHelper.dll ir Costura.dll nėra sugeneruoti, tik du failai, itsvse.exe galima paleisti tiesiogiai be klaidų! (PDB failą galima ištrinti).
Naudokime ILSpy įrankį, kad dekompiliuotume programą ir pažvelkime į sugeneruotą šaltinio kodą, kaip parodyta paveikslėlyje žemiau:
Įgyvendinimo principo įvadas
Kai CLR bando įkelti rinkinį, bet nepavyksta įkelti, jis iškelia įvykį AppDomain.AssemblyResolve. Mūsų programa gali klausytis šio įvykio ir grąžinti rinkinį, kurį CLR bando įkelti į įvykių apdorojimo programą, kad programa galėtų toliau normaliai veikti.
Fody.Costura įterpia visus DLL, kuriuos nurodo EXE, į EXE failą kurdamas projektą. Kai programa vykdymo metu naudoja vieną iš šių DLL (įvykis AppDomain.AssemblyResolve suaktyvinamas, nes CLR negali rasti DLL failo), reikalingas DLL išgaunamas iš įdėtųjų EXE failo išteklių.
Matote, kad metodas Pridėti klausosi įvykio AppDomain.AssemblyResolve. Kai CLR nepavyksta sėkmingai įkelti rinkinio, vykdoma įvykių apdorojimo programa AssemblyResolve. "AssemblyResolve" bando gauti paskirties rinkinį iš įkelto rinkinio įdėtojo ištekliaus naudojant metodą Common.ReadFromEmbeddedResources ir grąžina jį į CLR.
Tai matydami, galite paklausti, kada buvo įdiegtas Attach metodas?
Tiesą sakant, C# kalbai CLR slepia didelį triuką - CLR gali vykdyti tam tikrą inicijuotą kodą prieš įkeliant kiekvieną modulį (kiekviename rinkinyje yra vienas ar daugiau modulių). Deja, C# kalba nekontroliuoja šios kodo dalies. Fody.Costura įveda IL kodą tiesiai į EXE rinkinio vidinio modulio inicijavimo funkciją, o ši IL kodo dalis iš tikrųjų vykdo Attach metodą. Tokiu būdu, įkėlus EXE rinkinį, galima nedelsiant iškviesti pridėjimo metodą.
Aukščiau pateiktas trumpas įvadas į Fody.Cotura įgyvendinimo principą.
Išplėstinė konfigūracija
Šios konfigūracijos pridedamos arba modifikuojamos CosturaFodyWeavers.xml failuose.
Kurti laikinus rinkinius Numatytasis: klaidingas Tai įterpia įdėtąjį failą į diską prieš įkeliant jį į atmintį. Tai naudinga tam tikriems scenarijams, kai norite įkelti rinkinį iš fizinio failo.
IncludeDebugSymbols Numatytasis: teisingas Kontroliuoja, ar taip pat įterpti etaloninio rinkinio .pdbs.
IšjungtiGlaudinimas Numatytasis: klaidingas Įterptieji mazgai yra suglaudinti pagal numatytuosius nustatymus ir nesuglaudinti, kai įkeliami. Naudodami šią parinktį galite išjungti glaudinimą. Pastaba: Būtinai išjunkite šią ypatybę, kai nurodote nestandartinius DLL arba užšifruotus DLL. Priešingu atveju susidarys situacija, kad exe negalima atidaryti. Tai buvo atrasta, kai aš naudojau DSkin.dll.
Išjungti valymą Numatytasis: klaidingas Kaip "Costura" dalis, įterptieji komponentai nebėra įtraukti į versiją. Šį valymą galima išjungti.
LoadAtModuleInit Numatytasis: teisingas Costura įkeliama pagal numatytuosius nustatymus kaip modulio inicijavimo dalis. Vėliavėlė išjungia veikimą. Įsitikinkite, kad galite kur nors naudoti CosturaUtility.Initialize().
Išskirti rinkinius Kaip naudoti: ExcludeAssemblies="DLL1| DLL2" Rinkinių pavadinimų, kuriuos reikia pašalinti iš numatytojo veiksmo "įdėti visas kopijas vietines nuorodas", sąrašas.
Įtraukti rinkinius Kaip naudoti: IncludeAssemblies="DLL1| DLL2" Rinkinių pavadinimų, įtrauktų į numatytąjį veiksmą Įterpti visas vietines nuorodas.
Unmanaged32Assemblies&Unmanaged64Assemblies Kaip juo naudotis: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Mišraus režimo rinkinių negalima įkelti taip pat, kaip valdomų rinkinių. Todėl, siekiant padėti "Costura" nustatyti, kurie komponentai veikia mišriu režimu ir kokioje aplinkoje juos įkelti, jų pavadinimai turėtų būti įtraukti į vieną arba abu sąrašus. Į pavadinimą neįtraukite .exe ar .dll.
Išankstinis užsakymas Naudojimas: PreloadOrder="DLL1| DLL2" Vietines bibliotekas gali automatiškai įkelti Costura. Norėdami įtraukti vietinę biblioteką, įtraukite ją į savo projektą kaip įdėtąjį šaltinį, vadinamą aplanku costura32 arba costura64, atsižvelgiant į bibliotekos nestabilumą. Arba galite nurodyti įkėlimo tvarką, kuria įkeliamos iš anksto įkeltos bibliotekos. Kai maišote laikinus komponentus iš disko, jie taip pat yra iš anksto įkelti.
CosturaUtility Kaip naudoti:
"CosturaUtility" yra klasė, leidžianti rankiniu būdu inicijuoti "Costura" sistemą savo kode.Tai daugiausia taikoma scenarijams, kai modulio inicijavimo programa neveikia, pvz., bibliotekos ir "Mono.
Galiausiai atsisiųskite šaltinio kodą tekste:
Turistai, jei norite pamatyti paslėptą šio įrašo turinį, prašome Atsakyti
|