A Winform/wpf fejlesztés elkerülhetetlenül sok harmadik féltől származó DLL-re vonatkozik, de minden csomagoláskor a Debug könyvtárban lévő fájlokat át kell másolnod vagy megosztanod az ügyfélnek, ami nem túl kényelmes a használatra. Korábban több szoftvert is kipróbáltam dll fájlok összevonására, például az ILMerge-t, az Enigma Virtual Box-ot, de amíg meg nem tudtam a "Costura.Fody"-t, úgy éreztem, a világ sokkal jobb ~
Az alábbiakban a Winform által írt program, amely a "HttpHelper.dll" és "Newtonsoft.Json.dll" két DLL-re hivatkozik, amikor létrehozzuk a programot, egy exe fájl és ezek a két DLL fájl lesz, ami nagyon kényelmetlenül érzi magát az embereken, és ha egy DLL kevesebb van, a program kivételt jelenthet, ahogy az alábbi ábrán látható:
Az alábbi link az előző használat (nem ajánlott)
A Costura.Fody eszközzel össze tudod olvasni a forrás DLL-t a cél EXE-vel
Projekt honlapja: https://github.com/Fody/Costura
Hogyan kell közvetlenül telepíteni a nuget csomagot:
Ha sikeresen hozzáadtad a Costura.Fody-t, a megoldás automatikusan hozzáadja FodyWeavers.xml fájlt.
Generáld újra a megoldást, a sikered a program generáló könyvtárban látható, az összes DLL tökéletesen be van olvadva az exe-vel, közvetlenül másolhatod az exe fájlt a kliensbe, hogy önállóan futhasson. Ahogy az alábbiakban látható:
1>------ Minden újraépítés elindult: Projekt: itsvse, Konfiguráció: Bármilyen CPU hibakeresése ------ 1> Fody: Fody (2.0.0.0 verzió) Végrehajtás 1> Fody/Costura: Nem találtak utalást a 'Costura.dll'-re. Hivatkozások nem módosítottak. 1> Fody/Costura: 'E:\project\itsvse\itsvse\HttpHelper.dll' beágyazása 1> Fody/Costura: 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' beágyazása 1> Fody: Befejeztem a Fody 609ms-t. 1> Fody: Kihagytam az Ellenőrzési összeállítást, mivel a konfigurációban ki van tiltva 1> Fody: Kész az ellenőrzés 3 másodperc alatt. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regenerálj mindet: 1 sikerrel, 0 sikerrel, és 0 ========== kihagyva
Ahogy a fenti képen is látható, a generált fájl nem tartalmaz Newtonsoft.Json.dll, HttpHelper.dll és Costura.dll nem generálódnak, csak két fájlt, itsvse.exe hibázatlanul közvetlenül futtatható! (A PDB fájl törölhető).
Használjuk az ILSpy eszközt a programunk dekompilálására, és nézzük meg a generált forráskódot, ahogy az alábbi ábrán látható:
Bevezetés a megvalósítási elvhez
Amikor a CLR megpróbál betölteni egy assembly rendszert, de nem tölti be, az AppDomain.AssemblyResolve eseményt indítja. A programunk meghallgathatja ezt az eseményt, és vissza tudja küldeni azt az assembly rendszert, amelyet a CLR megpróbál betölteni az eseménykezelőben, hogy a program továbbra is normálisan működhessen.
A Fody.Costura az EXE által hivatkozott összes DLL-t beágyazza az EXE fájlba a projekt építésekor. Amikor egy program ezek közül az egyik DLL-t használja a végrehajtás során (az AppDomain.AssemblyResolve esemény azért indul ki, mert a CLR nem találja meg a DLL fájlt), a szükséges DLL-t az EXE fájl beágyazott erőforrásaiból nyerik.
Láthatod, hogy az Attach metódus az AppDomain.AssemblyResolve eseményt hallgatja. Ha a CLR nem sikeresen tölt be egy összeállítást, az AssemblyResolve eseménykezelő elindul. Az AssemblyResolve megpróbálja megszerezni a cél assembly beágyazott erőforrását a Common.ReadFromEmbeddedResources metódusal keresztül, majd visszaküldi a CLR-nek.
Ezt látva megkérdezheted, mikor vezették be az Attach módszert?
Valójában a C# nyelv esetében a CLR egy nagy trükköt rejt – a CLR képes inicializált kódot végrehajtani, mielőtt minden modul (minden összeállítás egy vagy több modult tartalmaz) betöltődne. Sajnos a C# nyelv nem rendelkezik ezen a kód feletti ellenőrzéssel. A Fody.Costura közvetlenül az IL kódot az EXE assembly belső moduljának inicializációs funkciójába fecskendezi, és ez az IL kód része valójában végrehajtja az Attach metódust. Így, miután az EXE összeállítás betöltődik, azonnal behívható az Attach módszer.
A fentiek rövid bevezetést nyújtanak a Fody.Costura megvalósítási elvéhez.
Fejlett konfiguráció
Ezeket a konfigurációkat CosturaFodyWeavers.xml fájlokban adják hozzá vagy módosítják.
CreateTemporaryAssemblies Alapértelmezés: hamis Ez beágyazza a beágyazott fájlt a lemezre, mielőtt betölti a memóriába. Ez bizonyos helyzetekben hasznos, amikor egy összeállítást akarsz betölteni egy fizikai fájlból.
IncludeDebugSymbols Alapértelmezett: true Szabályozza, hogy a referencia összeállítás .pdb-i is be vannak ágyazva.
DisableCompression Alapértelmezés: hamis A beágyazott összeszerelések alapértelmezés szerint tömörítve és betöltéskor nem tömörítik. Ezzel a lehetőséggel kikapcsolhatod a kompressziót. Megjegyzés: Mindenképpen kapcsold ki ezt a tulajdonságot, amikor nem szabványos DLL-ekre vagy titkosított DLL-ekre hivatkozol. Ellenkező esetben az exe nem nyitható meg. Ezt akkor fedeztem fel, amikor DSkin.dll használtam.
LetiltásTisztítás Alapértelmezés: hamis A Cosura részeként a beágyazott alkatrészek már nem szerepelnek az építésben. Ez a takarítás ki lehet kapcsolni.
LoadAtModuleInit Alapértelmezett: true A Costura alapértelmezetten a modul inicializációjának részeként töltődik be. A zászló letiltja a viselkedést. Győződj meg róla, hogy tudsz valahol használni a CosturaUtility.Initialize()-t.
ExcludeAssemblies Hogyan kell használni: ExcludeAssemblies="DLL1| DLL2" Egy lista az assembly nevekről, amelyeket ki kell zárni az alapértelmezett "beágyazd az összes helyi hivatkozást másolni" műveletből.
IncludeAssemblies Hogyan kell használni: IncludeAssemblies="DLL1| DLL2" Az összes helyi hivatkozás beágyazásának alapértelmezett műveletében szereplő assembly nevek listája.
Unmanaged32Assemblies&Unmanaged64Assemblies Hogyan kell használni: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" A vegyes módú összeállításokat nem lehet ugyanúgy betölteni, mint a kezelt összeállításokat. Ezért, hogy a Costura felismerje, mely komponensek kevert módban vannak, és mely környezetekben kell betölteni őket, a nevüket az egyik vagy mindkét listában fel kell tüntetni. Ne írj .exe vagy .dll a névben.
PreloadOrder Használat: PreloadOrder="DLL1| DLL2" A helyi könyvtárakat a Cosura automatikusan betöltheti. Ha helyi könyvtárat szeretnél beépíteni, tedd be a projektedbe beágyazott erőforrásként, amelyet costura32 vagy costura64 mappának hívnak, a könyvtár instabilitásától függően. Alternatívaként megadhatod a betöltési sorrendet, amelyben az előre betöltött könyvtárak betöltődnek. Amikor ideiglenes komponenseket keversz a lemezről, azok is előre betöltődnek.
CosturaUtility Hogyan kell használni:
A CosturaUtility egy olyan kaszt, amely lehetővé teszi, hogy manuálisan inicializáld a Costura rendszert a saját kódodban.Ez főként olyan helyzetekre vonatkozik, amikor a modul inicializációs program nem működik, például könyvtárakat és mono.
Végül töltsd le a forráskódot a szövegben:
Turisták, ha szeretnétek megnézni ennek a bejegyzésnek a rejtett tartalmát, kérlek Válasz
|