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é)
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ď
|