Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 219600|Odpověď: 43

[WinForm] .net/c# Použijte Costura.Fody k zabalení DLL do EXE

[Kopírovat odkaz]
Zveřejněno 14.04.2018 14:41:49 | | | |
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)

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



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ímOdpověď





Předchozí:Řešení StreamReaderu pro zkreslené znaky při čtení souborů
Další:Řešení konfliktů mezi Hyper-V a VirtualBoxem a VMware
Zveřejněno 07.06.2018 9:35:19 |
Vyzkoušejte tuto metodu integrace dependenční komponenty Dll do C# kompilovaného EXE!

Pokud se snadno používá, nezapomeňte ho pochválit! Haha, tohle, prostě přidejte Dll do resource souboru, jednoduché a praktické! (Nerozumím, můžu vymyslet návod) @小渣渣

 Pronajímatel| Zveřejněno 06.06.2018 10:30:42 |
Pokud podepíšete program, obdržíte následující chybu:

1>MSBUILD : chyba : Fody: Došlo k nezpracované výjimce:
1>MSBUILD : chyba : Výjimka:
1>MSBUILD: chyba: Nelze získat veřejný klíč pro StrongNameKeyPair.
1>MSBUILD : chyba : StackTrace:
1>MSBUILD: chyba: at System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: chyba: in System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: chyba: in Mono.Cecil.ModuleWriter.WriteModuleTo(modul ModuleDefinition, proud Disposable'1, parametry WriterParameters)
1>MSBUILD: chyba: in Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters)
1>MSBUILD: chyba: V InnerWeaver.WriteModule() pozice C:\projects\fody\FodyIsolated\ModuleWriter.cs: řádek číslo 18
1>MSBUILD: chyba: V InnerWeaver.Execute() pozice C:\projects\fody\FodyIsolated\InnerWeaver.cs: řádek číslo 86
1>MSBUILD : chyba : Zdroj:
1>MSBUILD : chyba : mscorlib
1>MSBUILD : chyba : TargetSite:
1>MSBUILD : error : Byte[] ComputePublicKey()
1>MSBUILD : chyba :
1> Fody: Dokončil jsem Fody 551 ms.


Zdá se, že řešení neexistuje, viz článek:

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

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


Nespoléhejte se na silná jména, abyste zůstali v bezpečí.

Zdá se tedy zbytečné dělat něco navíc pro ochranu něčeho, co není bezpečnostní prvek

 Pronajímatel| Zveřejněno 17.04.2018 13:02:12 |
xxhh Zveřejněno 17. 4. 2018 11:35
Po přímé instalaci Costura.Fody vs NuGet jsem přetáhl přehrávač Windows Media Playe, abych vygeneroval dvě vestavěné dll pro smazání nebo nahlášení ...

Ovládání Windows Media Playeru jsou komunikační komponenty, nevím, jestli je "Costura.Fody" podporuje.

1: Měl bys zjistit, jestli "Costura.Fody" podporuje "komunikační komponenty"
2: Ignorujte dvě DLL, které jsou zabalené, pokud jde o nastavení nastavení xml, podívejte se prosím na oficiální dokumentaci
Zveřejněno 17.04.2018 10:29:52 |
Stáhněte si pro zobrazení XML konfigurace
Zveřejněno 17.04.2018 10:33:34 |
Majitel se tě chce zeptat, jestli můžu video a dll dostat dohromady do exe pluginu
 Pronajímatel| Zveřejněno 17.04.2018 11:16:15 |
xxhh Zveřejněno 17. 4. 2018 10:33
Majitel se tě chce zeptat, jestli můžu video a dll dostat dohromady do exe pluginu
...

Můžete to udělat – můžete nastavit vlastnost videa na "Embedded Resources" a pak přečíst soubor s resource.
Zveřejněno 17.04.2018 11:35:51 |
Xiao Zhao zveřejnil 17. 4. 2018 v 11:16
Můžete to udělat – můžete nastavit vlastnost videa na "Embedded Resources" a pak přečíst soubor s resource. ...

Po instalaci Costura.Fody vs NuGet jsem hned přetáhl přehrávač Windows Media Playe a vytvořil dvě vestavěné dll pro smazání nebo hlášení chyby  
Zveřejněno 17.04.2018 11:57:09 |
Musí být XML stále nastaveno?     
Zveřejněno 17.04.2018 17:42:31 |
Xiao Zhao zveřejnil 17. 4. 2018 v 11:16
Můžete to udělat – můžete nastavit vlastnost videa na "Embedded Resources" a pak přečíst soubor s resource. ...

Ať už pronajímatel nebo já, chci se zeptat, vložím video do vloženého zdroje, co se odečte je bajtové pole, existuje nějaký způsob, jak ho vložit do přehrávače a přehrát přímo (nechci zapisovat do lokálního systému, aby ho přehrál ve čtecí cestě, video je víc než velká karta).
 Pronajímatel| Zveřejněno 17.04.2018 20:52:16 |
xxhh Zveřejněno 17. 4. 2018 17:42
Ať už je to pronajímatel nebo já, chci se zeptat, vložím video do vloženého zdroje a vypadne pole bajtů, existuje nějaký způsob, jak ho vložit do přehrávače a přehrát přímo ( ...

Nedoporučuje se převádět velké video do resource souboru, můžete zjistit, zda existuje jiný způsob, jak by přehrávač mohl přímo předat v bajtech[]
Zveřejněno 18.04.2018 8:08:48 |
Xiao Zhazha Zveřejněno 17. 4. 2018 20:52
Nedoporučuje se převádět velké video do resource souboru, můžete zjistit, zda neexistuje jiný způsob, jak by přehrávač mohl přímo předat v bajtech[] ...

Nikdo z nich nečte video projevy a nechce se vás zeptat, jaké máte dobré nápady
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com