Vývoj ve Winform/WPF nevyhnutelně odkazuje na mnoho DLL třetích stran, ale pokaždé, když je zabalíte, musíte soubory z Debug adresáře zákazníkovi zkopírovat nebo je sdílet, což není příliš pohodlné. Zkoušel jsem už několik programů na sloučení dll souborů, například ILMerge, Enigma Virtual Box atd., ale dokud jsem se nedozvěděl o "Costura.Fody", měl jsem pocit, že svět je mnohem lepší~
Následuje program napsaný Winformem, odkazující na dvě DLL "HttpHelper.dll" a "Newtonsoft.Json.dll". Při generování programu bude exe soubor a tyto dva DLL soubory, což lidi velmi znepokojuje, a pokud je o jedno DLL méně, program může nahlásit výjimku, jak je znázorněno na obrázku níže:
Odkaz níže ukazuje předchozí použití (nedoporučováno)
Pomocí nástroje Costura.Fody můžete sloučit zdrojové DLL do cílového EXE
Domovská stránka projektu: https://github.com/Fody/Costura
Jak používat, přímo nainstalovat balíček Nuget:
Jakmile úspěšně přidáte Costura.Fody, řešení automaticky přidá FodyWeavers.xml soubor.
Znovu vygenerujte řešení, můžete vidět svůj úspěch v adresáři generování programů, všechny DLL jsou dokonale sloučené do exe, můžete exe soubor přímo zkopírovat do klienta a spustit ho nezávisle. Jak je uvedeno níže:
1>------ Všechny rebuildy byly zahájeny: Project: itsvse, Configuration: Debug Any CPU ------ 1> Fody: Fody (verze 2.0.0.0) Spuštění 1> Fody/Costura: Není nalezena žádná zmínka o 'Costura.dll'. Reference neupraveny. 1> Fody/Costura: Vložení 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Vložení 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Dokončen Fody 609ms. 1> Fody: Přeskočil jsem Verifying assembl, protože je v konfiguraci zakázán 1> Fody: Ověření dokončeno za 3 ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regenerovat všechny: 1 uspěje, 0 selže a 0 ========== přeskočeno
Jak je vidět na obrázku výše, vygenerovaný soubor neobsahuje Newtonsoft.Json.dll, HttpHelper.dll a Costura.dll nejsou generovány, pouze dva soubory, itsvse.exe lze spustit přímo bez chyb! (Soubor PDB lze smazat).
Použijme nástroj ILSpy k dekompilaci našeho programu a podívejme se na generovaný zdrojový kód, jak je znázorněno na obrázku níže:
Úvod do implementačního principu
Když se CLR pokusí načíst assembler, ale neuspěje, vyvolá událost AppDomain.AssemblyResolve. Náš program může naslouchat této události a vrátit sestavu, kterou se CLR snaží načíst do obslužné složky události, aby program mohl pokračovat v normální činnosti.
Fody.Costura vkládá všechny DLL soubory na EXE při sestavování projektu všechny DLL odkazované v EXE souboru. Když program použije jednu z těchto DLL během vykonávání (událost AppDomain.AssemblyResolve je spuštěna, protože CLR nemůže najít soubor DLL), požadovaná DLL je extrahována z vložených zdrojů souboru EXE.
Vidíte, že metoda Attach naslouchá události AppDomain.AssemblyResolve. Pokud CLR neúspěšně načte assembler, spustí se obslužná složka událostí AssemblyResolve. AssemblyResolve se snaží získat cílovou sestavu z vloženého zdroje načtené sestavy pomocí metody Common.ReadFromEmbeddedResources a vrací ji do CLR.
Když to vidíte, možná se ptáte, kdy byla metoda Attach implementována?
Ve skutečnosti CLR pro jazyk C# skrývá velký trik – CLR může spustit inicializovaný kód ještě před načtením každého modulu (každý assembler obsahuje jeden nebo více modulů). Bohužel jazyk C# nemá nad touto částí kódu žádnou kontrolu. Fody.Costura vkládá IL kód přímo do inicializační funkce interního modulu EXE assembleru a tato část IL kódu skutečně vykonává metodu Appat. Tímto způsobem, jakmile je sestava EXE načtena, lze metodu Attach okamžitě vyvolat.
Výše uvedené je stručným úvodem do implementačního principu Fody.Costura.
Pokročilá konfigurace
Tyto konfigurace jsou přidávány nebo upravovány v CosturaFodyWeavers.xml souborech.
CreateTemporaryAssemblies Výchozí: false Tímto se vložený soubor vloží na disk před jeho načtením do paměti. To je užitečné v určitých situacích, kdy chcete načíst sestavu z fyzického souboru.
IncludeDebugSymbols Výchozí: true Ovládá, zda jsou .pdbs referenční sestavy také vloženy.
DisableCompression Výchozí: false Vložené sestavy jsou ve výchozím nastavení komprimovány a při načítání nekomprimované. Kompresi můžete vypnout pomocí této možnosti. Poznámka: Nezapomeňte tuto vlastnost vypnout při odkazování na nestandardní DLL nebo šifrované DLL. Jinak to povede k situaci, kdy exe nebude možné otevřít. To se objevilo, když jsem používal DSkin.dll.
VypnoutČištění Výchozí: false V rámci Costury již nejsou vestavěné komponenty součástí této sestavy. Toto čištění lze vypnout.
LoadAtModuleInit Výchozí: true Costura se načítá ve výchozím nastavení jako součást inicializace modulu. Vlajka toto chování deaktivuje. Ujistěte se, že můžete někde použít CosturaUtility.Initialize().
ExcluttereAssemblies Jak používat: ExcludeAssemblies="DLL1| DLL2" Seznam názvů assemblerů, které je třeba vyloučit z výchozí akce "vložit všechny kopírovací lokální reference".
IncludeAssemblies Jak používat: IncludeAssemblies="DLL1| DLL2" Seznam jmen assemblerů zahrnutých ve výchozí akci Embedding All Copy Local References.
Unmanaged32Assemblies&Unmanaged64Assemblies Jak to používat: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Smíšené režimy sestavení nelze načíst stejným způsobem jako spravované sestavy. Proto, aby Costura lépe identifikovala, které komponenty jsou ve smíšeném režimu a v jakých prostředích je načíst, měly by být jejich názvy zahrnuty v jednom nebo obou seznamech. Neuvádějte .exe ani .dll v názvu.
Přednačítací pořadí Použití: PreloadOrder="DLL1| DLL2" Místní knihovny lze automaticky načíst pomocí Costura. Pokud chcete zahrnout lokální knihovnu, zahrňte ji do svého projektu jako vložený zdroj nazvaný složka costura32 nebo costura64 podle nestability knihovny. Alternativně můžete určit pořadí načítání, ve kterém se přednačtené knihovny načítají. Když mícháte dočasné komponenty z disku, jsou také předem nahrané.
CosturaUtility Jak používat:
CosturaUtility je třída, která vám umožňuje ručně inicializovat systém Costura ve vlastním kódu.To platí hlavně pro situace, kdy program pro inicializaci modulu nefunguje, jako jsou knihovny a Mono.
Nakonec si stáhněte zdrojový kód v textu:
Turisté, pokud chcete vidět skrytý obsah tohoto příspěvku, prosím Odpověď
|