Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 219600|Odpoveď: 43

[WinForm] .net/c# Použite Costura.Fody na zabalenie DLL do EXE

[Kopírovať odkaz]
Zverejnené 14. 4. 2018 14:41:49 | | | |
Vývoj vo Winform/WPF nevyhnutne odkazuje na množstvo DLL tretích strán, ale zakaždým, keď ho zabalíte, musíte súbory z Debug adresára skopírovať zákazníkovi alebo ich zdieľať, čo nie je veľmi pohodlné. Skúšal som niekoľko softvérov na zlúčenie dll súborov, napríklad ILMerge, Enigma Virtual Box a podobne, ale kým som sa nedozvedel o "Costura.Fody", mal som pocit, že svet je oveľa lepší~

Nasleduje program napísaný Winformom, ktorý odkazuje na dve DLL "HttpHelper.dll" a "Newtonsoft.Json.dll", keď program generujeme, bude tam exe súbor a tieto dva DLL súbory, čo ľudí veľmi znepokojuje, a ak je o jedno DLL menej, program môže nahlásiť výnimku, ako je znázornené na obrázku nižšie:



Nižšie uvedený odkaz je predchádzajúce použitie (neodporúčané)

C# zabalí dll do programu exe
http://www.itsvse.com/thread-2841-1-1.html
(Zdroj: Architect_Programmer)



Pomocou nástroja Costura.Fody môžete zlúčiť zdrojové DLL do cieľového EXE súboru

Domovská stránka projektu: https://github.com/Fody/Costura

Ako používať a priamo nainštalovať balík Nuget:



Keď úspešne pridáte Costura.Fody, riešenie automaticky pridá FodyWeavers.xml súbor.

Znovu vygenerujte riešenie, môžete vidieť svoj úspech v adresári na generovanie programov, všetky DLL sú dokonale zlúčené do exe, môžete priamo skopírovať exe súbor do klienta, aby bežal nezávisle. Ako je uvedené nižšie:

1>------ Všetky rebuildy boli spustené: Project: itsvse, Configuration: Debug Any CPU ------
1> Fody: Fody (verzia 2.0.0.0) Vykonávanie
1> Fody/Costura: Nebola nájdená žiadna zmienka o 'Costura.dll'. Referencie neboli upravené.
1> Fody/Costura: Vkladanie 'E:\project\itsvse\itsvse\HttpHelper.dll'
1> Fody/Costura: Vkladanie 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll'
1> Fody: Dokončený Fody 609ms.
1> Fody: Vynechané overovanie zostavy, pretože je v konfigurácii deaktivované
1> Fody: Overenie dokončené za 3ms.
1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe
========== Regeneruj všetkých: 1 uspeje, 0 zlyhá a 0 ========== preskočených





Ako je vidieť na obrázku vyššie, vygenerovaný súbor neobsahuje Newtonsoft.Json.dll, HttpHelper.dll a Costura.dll nie sú vygenerované, iba dva súbory, itsvse.exe môžu byť spustené priamo bez chýb! (Súbor PDB je možné vymazať).

Použime nástroj ILSpy na dekompiláciu nášho programu a pozrime sa na vygenerovaný zdrojový kód, ako je znázornené na obrázku nižšie:



Úvod do implementačného princípu

Keď sa CLR pokúsi načítať assembler, ale neúspešne načíta, vyvolá udalosť AppDomain.AssemblyResolve. Náš program môže počúvať túto udalosť a vrátiť zostavu, ktorú sa CLR snaží načítať do obslužného modulu udalostí, aby program mohol pokračovať v normálnej funkcii.

Fody.Costura vkladá všetky DLL, na ktoré EXE odkazuje, do súboru EXE pri tvorbe projektu. Keď program použije jednu z týchto DLL počas vykonávania (udalosť AppDomain.AssemblyResolve sa spustí, pretože CLR nemôže nájsť DLL súbor), požadovaná DLL sa extrahuje z vložených zdrojov EXE súboru.


Vidíte, že metóda Attach počúva udalosť AppDomain.AssemblyResolve. Keď CLR úspešne načíta assembler, spustí sa obsługa udalostí AssemblyResolve. AssemblyResolve sa snaží získať cieľovú zostavu z vloženého zdroja načítaného zostavenia pomocou metódy Common.ReadFromEmbeddedResources a vráti ju do CLR.

Keď to vidíte, možno sa pýtate, kedy bola implementovaná metóda Attachment?

V skutočnosti pre jazyk C# CLR skrýva veľký trik – CLR môže vykonať inicializovaný kód ešte pred načítaním každého modulu (každý assembler obsahuje jeden alebo viac modulov). Bohužiaľ, jazyk C# nemá nad touto časťou kódu žiadnu kontrolu. Fody.Costura vstrekuje IL kód priamo do inicializačnej funkcie interného modulu EXE assembleru a táto časť IL kódu skutočne vykonáva metódu Attachment. Týmto spôsobom, keď je zostava EXE načítaná, je možné okamžite zavolať metódu Attachment.

Vyššie uvedené je stručným úvodom do implementačného princípu Fody.Costura.


Pokročilá konfigurácia

Tieto konfigurácie sa pridávajú alebo upravujú v CosturaFodyWeavers.xml súboroch.

CreateTemporaryAssemblies
Predvolené: nepravda
Týmto sa vložený súbor vloži na disk pred jeho načítaním do pamäte. To je užitočné v určitých situáciách, keď chcete načítať zostavu z fyzického súboru.

IncludeDebugSymbols
Predvolené: pravda
Kontroluje, či sú .pdbs referenčnej zostavy tiež vložené.

DisableCompression
Predvolené: nepravda
Vložené zostavy sú štandardne komprimované a pri načítaní nekomprimované. Kompresiu môžete vypnúť pomocou tejto možnosti.
Poznámka: Nezabudnite túto vlastnosť vypnúť pri odkazovaní na neštandardné DLL alebo šifrované DLL. Inak to povedie k situácii, že exe nebude možné otvoriť. Toto sa objavilo, keď som používal DSkin.dll.

DisaktivCleanup
Predvolené: nepravda
Ako súčasť Costury už zabudované komponenty nie sú súčasťou zostavy. Toto čistenie sa dá vypnúť.

LoadAtModuleInit
Predvolené: pravda
Costura sa načítava štandardne ako súčasť inicializácie modulu. Vlajka toto správanie deaktivuje. Uisti sa, že vieš niekde použiť CosturaUtility.Initialize().

ExcluttereAssemblies
Ako použiť: ExcludeAssemblies="DLL1| DLL2"
Zoznam názvov assemblerov, ktoré treba vylúčiť z predvolenej akcie "vložiť všetky lokálne referencie na kopírovanie".

IncludeAssemblies
Ako používať: IncludeAssemblies="DLL1| DLL2"
Zoznam názvov assemblerov zahrnutých v predvolenej akcii Embedding All Copy Local References.

Unmanaged32Assemblies&Unmanaged64Assemblies
Ako ho používať: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2"
Zmiešané režimové zostavy sa nedajú načítať rovnakým spôsobom ako spravované zostavy. Preto, aby Costura lepšie identifikovala, ktoré komponenty sú v zmiešanom režime a v ktorých prostrediach ich načítať, mali by byť ich názvy zahrnuté v jednom alebo oboch zoznamoch. Nezahrňujte .exe ani .dll do názvu.

PreloadOrder
Použitie: PreloadOrder="DLL1| DLL2"
Lokálne knižnice môže Costura automaticky načítať. Ak chcete zahrnúť lokálnu knižnicu, zahrňte ju do svojho projektu ako zabudovaný zdroj nazývaný priečinok costura32 alebo costura64 podľa nestability knižnice. Alternatívne môžete určiť poradie načítavania, v akom sa prednačítané knižnice načítavajú. Keď mixujete dočasné komponenty z disku, sú tiež predinštalované.

CosturaUtility
Ako používať:




CosturaUtility je trieda, ktorá vám umožňuje manuálne inicializovať systém Costura vo vlastnom kóde.Toto platí hlavne pre situácie, keď program na inicializačnú inštaláciu modulu nefunguje, ako sú knižnice a Mono.


Nakoniec si stiahnite zdrojový kód v texte:

Turisti, ak chcete vidieť skrytý obsah tohto príspevku, prosím.Odpoveď





Predchádzajúci:Riešenie pre StreamReader pre nesprávne znaky pri čítaní súborov
Budúci:Riešenia konfliktov medzi Hyper-V a VirtualBoxom a VMware
Zverejnené 7. 6. 2018 9:35:19 |
Vyskúšajte túto metódu integrácie závislostného komponentu DLL do C# kompilovaného EXE!

Ak sa ľahko používa, nezabudnite ho pochváliť! Haha, toto, stačí pridať Dll do súboru zdrojov, jednoduché a praktické! (Nerozumiem, viem vymyslieť návod) @小渣渣

 Prenajímateľ| Zverejnené 6. 6. 2018 10:30:42 |
Ak podpíšete program, dostanete nasledujúcu chybu:

1>MSBUILD : chyba : Fody: Vyskytla sa nespracovaná výnimka:
1>MSBUILD : chyba : Výnimka:
1>MSBUILD: chyba: Nepodarilo sa získať verejný kľúč pre StrongNameKeyPair.
1>MSBUILD : chyba : StackTrace:
1>MSBUILD: error: at System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: chyba: in System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: chyba: v Mono.Cecil.ModuleWriter.WriteModuleTo(modul ModuleDefinition, prúd Disposable'1, parametre WriterParameters)
1>MSBUILD: chyba: v Mono.Cecil.ModuleDefinition.Write(Názov súboru reťazca, parametre WriterParameters)
1>MSBUILD: chyba: V InnerWeaver.WriteModule() pozícia C:\projects\fody\FodyIsolated\ModuleWriter.cs: riadok číslo 18
1>MSBUILD: chyba: V InnerWeaver.Execute() pozícia C:\projects\fody\FodyIsolated\InnerWeaver.cs: číslo riadku 86
1>MSBUILD : chyba : Zdroj:
1>MSBUILD : chyba : mscorlib
1>MSBUILD : chyba : TargetSite:
1>MSBUILD : chyba : Byte[] ComputePublicKey()
1>MSBUILD : chyba :
1> Fody: Dokončil som Fody 551 ms.


Zdá sa, že riešenie neexistuje, pozri článok:

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

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


Nespoliehajte sa na silné mená, aby ste zostali v bezpečí.

Zdá sa teda zbytočné robiť niečo navyše na ochranu niečoho, čo nie je bezpečnostnou funkciou

 Prenajímateľ| Zverejnené 17. 4. 2018 13:02:12 |
xxhh Zverejnené 17.4.2018 11:35
Po inštalácii Costura.Fody priamo do vs NuGet som potiahol prehrávač Windows Media Playe, aby som vygeneroval dve zabudované dll na vymazanie alebo nahlásenie ...

Ovládanie Windows Media Playeru sú komunikačné komponenty, neviem, či ich "Costura.Fody" podporuje.

1: Mali by ste zistiť, či "Costura.Fody" podporuje "komunikačné komponenty"
2: Ignorujte dve DLL, ktoré sú zabalené, čo sa týka nastavenia xml, pozrite si prosím oficiálnu dokumentáciu pre podrobnosti
Zverejnené 17. 4. 2018 10:29:52 |
Stiahnite si a pozrite si XML konfiguráciu
Zverejnené 17. 4. 2018 10:33:34 |
Majiteľ sa vás chce opýtať, či môžem video a dll dostať dokopy do exe pluginu
 Prenajímateľ| Zverejnené 17. 4. 2018 11:16:15 |
xxhh Zverejnené 17.4.2018 10:33
Majiteľ sa vás chce opýtať, či môžem video a dll dostať dokopy do exe pluginu
...

Môžete to urobiť – môžete nastaviť video vlastnosť na "Embedded Resources" a potom prečítať súbor zdroja.
Zverejnené 17. 4. 2018 11:35:51 |
Xiao Zhao zverejnil 17.4.2018 o 11:16
Môžete to urobiť – môžete nastaviť video vlastnosť na "Embedded Resources" a potom prečítať súbor zdroja. ...

Po inštalácii Costura.Fody vs NuGet som okamžite pretiahol prehrávač Windows Media Playe a vytvoril som dva zabudované DLL na vymazanie alebo nahlásenie chyby  
Zverejnené 17. 4. 2018 11:57:09 |
Musí sa XML stále nastavovať?     
Zverejnené 17. 4. 2018 17:42:31 |
Xiao Zhao zverejnil 17.4.2018 o 11:16
Môžete to urobiť – môžete nastaviť video vlastnosť na "Embedded Resources" a potom prečítať súbor zdroja. ...

Prenajímateľ alebo ja, chcem sa opýtať, vložím video do vloženého zdroja, čo sa prečíta, je bajtové pole, existuje nejaký spôsob, ako ho vložiť do prehrávača a prehrať priamo (nechcem zapisovať do lokálneho systému, aby som prehrával v čítacej ceste, video je viac než len veľká karta).
 Prenajímateľ| Zverejnené 17. 4. 2018 20:52:16 |
xxhh Zverejnené 17.4.2018 17:42
Či už prenajímateľ alebo ja, chcem sa opýtať, vložím video do vloženého zdroja a zobrazí sa bajtové pole, existuje nejaký spôsob, ako ho vložiť do prehrávača a prehrávať priamo ( ...

Neodporúča sa premeniť veľké video na resource file, môžete zistiť, či neexistuje iný spôsob, ako prehrávač môže priamo prechádzať v byte[]
Zverejnené 18. 4. 2018 8:08:48 |
Xiao Zhazha Zverejnené 17.4.2018 20:52
Neodporúča sa premeniť veľké video na resource file, môžete zistiť, či neexistuje iný spôsob, ako by prehrávač mohol priamo prejsť v byte[] ...

Nikto z nich nečíta video prejavy a nechce sa ťa opýtať, aké dobré nápady máš
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com