Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 219600|Atsakyti: 43

[WinForm] .net/c# Naudokite Costura.Fody, kad supakuotumėte DLL į EXE

[Kopijuoti nuorodą]
Paskelbta 2018-04-14 14:41:49 | | | |
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)

C# supakuoja dll į exe programą
http://www.itsvse.com/thread-2841-1-1.html
(Šaltinis: Architect_Programmer)



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šomeAtsakyti





Ankstesnis:"StreamReader" sprendimas iškraipytiems simboliams skaitant failus
Kitą:Konfliktų tarp "Hyper-V" ir "VirtualBox" bei "VMware" sprendimai
Paskelbta 2018-06-07 09:35:19 |
Išbandykite šį metodą apie priklausomybės komponento Dll integravimą į C# kompiliuotą EXE!

Jei juo lengva naudotis, nepamirškite jo pagirti! Haha, tai, tiesiog pridėkite DLL prie išteklių failo, paprasta ir praktiška! (Nesuprantu, galiu sugalvoti pamoką) @小渣渣

 Savininkas| Paskelbta 2018-06-06 10:30:42 |
Jei pasirašysite programą, gausite šią klaidą:

1>MSBUILD: klaida: Fody: Įvyko neapdorota išimtis:
1>MSBUILD: klaida: Išimtis:
1>MSBUILD: klaida: nepavyko gauti StrongNameKeyPair viešojo rakto.
1>MSBUILD: klaida: StackTrace:
1>MSBUILD: klaida: System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: klaida: System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: klaida: Mono.Cecil.ModuleWriter.WriteModuleTo(ModuleDefinition modulis, Disposable'1 srautas, WriterParameters parametrai)
1>MSBUILD: klaida: Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parametrai)
1>MSBUILD: klaida: InnerWeaver.WriteModule() padėtyje C:\projects\fody\FodyIsolated\ModuleWriter.cs: 18 eilutės numeris
1>MSBUILD: klaida: InnerWeaver.Execute() padėtyje C:\projects\fody\FodyIsolated\InnerWeaver.cs: eilutės numeris 86
1>MSBUILD: klaida: Šaltinis:
1>MSBUILD: klaida: mscorlib
1>MSBUILD: klaida: TargetSite:
1>MSBUILD: klaida: baitas[] ComputePublicKey()
1>MSBUILD: klaida:
1> Fody: Baigtas Fody 551ms.


Atrodo, kad sprendimo nėra, žiūrėkite straipsnį:

https://github.com/Fody/ExtraConstraints/issues/5

https://github.com/Fody/Costura/issues/194


Nepasikliaukite stipriais vardais, kad būtumėte saugūs.

Taigi atrodo beprasmiška žengti papildomą mylią, kad apsaugotume tai, kas nėra saugos funkcija

 Savininkas| Paskelbta 2018-04-17 13:02:12 |
xxhh Nusiųsta: 2018-4-17 11:35
Įdiegęs "Costura.Fody" tiesiai į "vs NuGet", nutempiau "Windows Media Playe" grotuvą, kad sugeneruočiau du įmontuotus DLL, kuriuos galėčiau ištrinti arba pranešti ...

Windows Media Player valdikliai yra com komponentai, nežinau, ar "Costura.Fody" juos palaiko.

1: Turėtumėte pamatyti, ar "Costura.Fody" palaiko "com komponentus"
2: Ignoruokite du DLL, kurie yra supakuoti, kaip ignoruoti xml turėtų būti nustatyta, daugiau informacijos ieškokite oficialioje dokumentacijoje
Paskelbta 2018-04-17 10:29:52 |
Atsisiųskite, kad pamatytumėte XML konfigūraciją
Paskelbta 2018-04-17 10:33:34 |
Savininkas nori paklausti jūsų, jei aš galiu gauti vaizdo ir DLL kartu į exe įskiepiai
 Savininkas| Paskelbta 2018-04-17 11:16:15 |
xxhh Nusiųsta: 2018-4-17 10:33
Savininkas nori paklausti jūsų, jei aš galiu gauti vaizdo ir DLL kartu į exe įskiepiai
...

Tai galite padaryti, galite nustatyti vaizdo įrašo ypatybę į "Įterptieji ištekliai" ir perskaityti išteklių failą.
Paskelbta 2018-04-17 11:35:51 |
Xiao Zhao Parašė 2018-4-17 11:16
Tai galite padaryti, galite nustatyti vaizdo įrašo ypatybę į "Įterptieji ištekliai" ir perskaityti išteklių failą. ...

Aš nutempiau "Windows Media Playe" grotuvą iškart po to, kai įdiegiau "Costura.Fody" ir sukūriau du įmontuotus DLL, kad ištrinčiau arba praneščiau apie klaidą  
Paskelbta 2018-04-17 11:57:09 |
Ar XML vis dar reikia nustatyti?     
Paskelbta 2018-04-17 17:42:31 |
Xiao Zhao Parašė 2018-4-17 11:16
Tai galite padaryti, galite nustatyti vaizdo įrašo ypatybę į "Įterptieji ištekliai" ir perskaityti išteklių failą. ...

Nuomotojas ar aš, noriu paklausti, aš įdėjau vaizdo įrašą į įterptą šaltinį, kas skaitoma yra baitų masyvas, ar yra koks nors būdas įdėti jį į grotuvą ir paleisti jį tiesiogiai (aš nenoriu rašyti vietiniam žaisti skaitymo kelyje, vaizdo įrašas yra daugiau nei didelė kortelė)
 Savininkas| Paskelbta 2018-04-17 20:52:16 |
xxhh Nusiųsta: 2018-4-17 17:42
Nuomotojas ar aš, noriu paklausti, aš įdėjau vaizdo įrašą į įterptą šaltinį, ir tai, kas skaitoma, yra baitų masyvas, ar yra koks nors būdas jį įdėti į grotuvą ir paleisti tiesiogiai ( ...

Nerekomenduojama padaryti didelio vaizdo įrašo į išteklių failą, galite pamatyti, ar yra koks nors kitas būdas grotuvui tiesiogiai perduoti baitą[]
Paskelbta 2018-04-18 08:08:48 |
Xiao Zhazha Publikuota: 2018-4-17 20:52
Nerekomenduojama padaryti didelio vaizdo įrašo į išteklių failą, galite pamatyti, ar yra koks nors kitas būdas grotuvui tiesiogiai perduoti baitą[] ...

Nė vienas iš jų neskaito vaizdo įrašų adresų ir nenori paklausti, kokių gerų idėjų turite
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com