Winform/wpf izstrāde neizbēgami attiecas uz daudziem trešo pušu DLL, bet katru reizi, kad to iesaiņojat, jums ir jākopē atkļūdošanas direktorijā esošie faili klientam vai jākoplieto tie, kas nav ļoti ērti lietojami. Es iepriekš esmu izmēģinājis vairākas programmatūras, lai apvienotu dll failus, piemēram, ILMerge, Enigma Virtual Box utt., bet, kamēr es uzzināju par "Costura.Fody", es jutu, ka pasaule ir daudz labāka ~
Šī ir Winform rakstīta programma, atsaucoties uz diviem DLL "HttpHelper.dll" un "Newtonsoft.Json.dll", kad mēs ģenerējam programmu, būs exe fails un šie divi DLL faili, kas liek cilvēkiem justies ļoti neērti, un, ja ir viens mazāk DLL, programma var ziņot par izņēmumu, kā parādīts zemāk redzamajā attēlā:
Zemāk esošā saite ir iepriekšējais lietojums (nav ieteicams)
Izmantojot rīku Costura.Fody, varat apvienot avota DLL mērķa EXE
Projekta mājaslapa: https://github.com/Fody/Costura
Kā lietot, tieši instalējiet nuget paketi:
Kad esat veiksmīgi pievienojis Costura.Fody, risinājums automātiski pievienos FodyWeavers.xml failu.
Atjaunojiet risinājumu, jūs varat redzēt savus panākumus programmas ģenerēšanas direktorijā, visi DLL ir lieliski apvienoti exe, jūs varat tieši kopēt exe failu klientam, lai tas darbotos neatkarīgi. Kā parādīts zemāk:
1>------ Visi pārbūvējumi ir sākti: Projekts: itsvse, Konfigurācija: Atkļūdot jebkuru CPU ------ 1> Fody: Fody (versija 2.0.0.0) Izpilde 1> Fody/Costura: Atsauce uz "Costura.dll" nav atrasta. Atsauces nav modificētas. 1> Fody/Costura: "E:\project\itsvse\itsvse\HttpHelper.dll" iegulšana 1> Fody/Costura: "E:\project\itsvse\itsvse\Newtonsoft.Json.dll" iegulšana 1> Fody: Pabeigts Fody 609ms. 1> Fody: izlaista montāžas pārbaude, jo tā ir atspējota konfigurācijā 1> Fody: pabeigta verifikācija 3 ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Atjaunot visu: 1 izdodas, 0 neizdodas un 0 ========== izlaists
Kā redzams no iepriekš redzamā attēla, ģenerētais fails nesatur Newtonsoft.Json.dll, HttpHelper.dll un Costura.dll netiek ģenerēti, tikai divi faili, itsvse.exe var palaist tieši bez kļūdām! (PDB failu var izdzēst).
Izmantosim ILSpy rīku, lai dekompilētu mūsu programmu un apskatītu ģenerēto avota kodu, kā parādīts zemāk redzamajā attēlā:
Ievads īstenošanas principā
Kad CLR mēģina ielādēt montāžu, bet neizdodas ielādēt, tiek parādīts notikums AppDomain.AssemblyResolve. Mūsu programma var noklausīties šo notikumu un atgriezt montāžu, ko CLR mēģina ielādēt notikumu apdarinātājā, lai programma varētu turpināt normāli darboties.
Veidojot projektu, Fody.Costura iegulst visus DLL, uz kuriem atsaucas EXE, EXE failā. Ja programma izpildes laikā izmanto kādu no šiem DLL (notikums AppDomain.AssemblyResolve tiek aktivizēts, jo CLR nevar atrast DLL failu), nepieciešamais DLL tiek izvilkts no EXE faila iegultajiem resursiem.
Varat redzēt, ka pievienošanas metode klausās notikumu AppDomain.AssemblyResolve. Ja CLR neizdodas veiksmīgi ielādēt montāžu, tiek izpildīts notikumu apdarinātājs AssemblyResolve. AssemblyResolve mēģina iegūt mērķa montāžu no ielādētās montāžas iegultā resursa, izmantojot metodi Common.ReadFromEmbeddedResources, un atgriež to CLR.
Redzot to, jūs varat jautāt, kad tika ieviesta Attach metode?
Patiesībā C# valodā CLR slēpj lielu triku - CLR var izpildīt kādu inicializētu kodu pirms katra moduļa ielādes (katrā komplektā ir viens vai vairāki moduļi). Diemžēl C# valoda nekontrolē šo koda daļu. Fody.Costura ievada IL kodu tieši EXE montāžas iekšējā moduļa inicializācijas funkcijā, un šī IL koda daļa faktiski izpilda Attach metodi. Tādā veidā, kad EXE montāža ir ielādēta, Attach metodi var izsaukt nekavējoties.
Iepriekš minētais ir īss ievads Fody.Cotura ieviešanas principā.
Papildu konfigurācija
Šīs konfigurācijas tiek pievienotas vai modificētas CosturaFodyWeavers.xml failos.
Izveidot pagaidu montāžas Noklusējums: false Tādējādi iegultais fails tiek iegults diskā pirms tā ielādes atmiņā. Tas ir noderīgi noteiktos scenārijos, kad vēlaties ielādēt montāžu no fiziska faila.
IncludeDebugSymbols Noklusējums: true Kontrolē, vai ir iegulti arī atsauces komplekta .pdbs.
Atspējot saspiešanu Noklusējums: false Iegultie komplekti tiek saspiesti pēc noklusējuma un nesaspiesti, kad tie tiek ielādēti. Izmantojot šo opciju, varat izslēgt saspiešanu. Piezīme: Noteikti izslēdziet šo rekvizītu, atsaucoties uz nestandarta DLL vai šifrētiem DLL. Pretējā gadījumā tas novedīs pie situācijas, ka exe nevar atvērt. Tas tika atklāts, lietojot DSkin.dll.
Atspējot tīrīšanu Noklusējums: false Kā daļa no Costura, iegultie komponenti vairs nav iekļauti būvējumā. Šo tīrīšanu var izslēgt.
LoadAtModuleInit Noklusējums: true Costura pēc noklusējuma tiek ielādēts kā daļa no moduļa inicializācijas. Karodziņš atspējo darbību. Pārliecinieties, vai varat izmantot CosturaUtility.Initialize() kaut kur.
Izslēgt montāžas Kā lietot: ExcludeAssemblies="DLL1| DLL2" Komplektu nosaukumu saraksts, kas jāizslēdz no noklusējuma darbības "iegult visas lokālās atsauces kopijas".
IncludeAssemblies Kā lietot: IncludeAssemblies="DLL1| DLL2" To montāžu nosaukumu saraksts, kas iekļauti noklusējuma darbībā Visu lokālo atsauču iegulšana.
Unmanaged32Assemblies&Unmanaged64Assemblies Kā to izmantot: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Jauktā režīma komplektus nevar ielādēt tāpat kā pārvaldītos komplektus. Tāpēc, lai palīdzētu Costura identificēt, kuri komponenti ir jauktā režīmā un kādā vidē tos ielādēt, to nosaukumi ir jāiekļauj vienā vai abos sarakstos. Nosaukumā neiekļaujiet .exe vai .dll.
Iepriekšēja ielādePasūtījums Lietojums: PreloadOrder="DLL1| DLL2" Vietējās bibliotēkas var automātiski ielādēt Costura. Lai iekļautu lokālo bibliotēku, iekļaujiet to projektā kā iegultu resursu, ko sauc par mapi costura32 vai costura64 atkarībā no bibliotēkas nestabilitātes. Varat arī norādīt ielādes secību, kādā tiek ielādētas iepriekš ielādētās bibliotēkas. Sajaucot pagaidu komponentus no diska, tie ir arī iepriekš ielādēti.
CosturaUtility Kā lietot:
CosturaUtility ir klase, kas ļauj manuāli inicializēt Costura sistēmu savā kodā.Tas galvenokārt attiecas uz scenārijiem, kad moduļa inicializācijas programma nedarbojas, piemēram, bibliotēkas un Mono.
Visbeidzot, lejupielādējiet avota kodu tekstā:
Tūristi, ja vēlaties redzēt šīs ziņas slēpto saturu, lūdzu Atbildi
|