Winform/wpf-kehitys viittaa väistämättä moniin kolmannen osapuolen DLL-tiedostoihin, mutta joka kerta kun paketoit sen, sinun täytyy kopioida Debug-hakemiston tiedostot asiakkaalle tai jakaa ne, mikä ei ole kovin kätevää käyttää. Olen kokeillut useita ohjelmistoja dll-tiedostojen yhdistämiseen, kuten ILMerge, Enigma Virtual Box jne., mutta ennen kuin opin "Costura.Fodysta", tuntui siltä, että maailma oli paljon parempi~
Seuraava on Winformin kirjoittama ohjelma, joka viittaa kahteen DLL:ään "HttpHelper.dll" ja "Newtonsoft.Json.dll"; kun generoimme ohjelman, mukana on exe-tiedosto ja nämä kaksi DLL-tiedostoa, mikä saa ihmiset tuntemaan olonsa hyvin epämukavaksi, ja jos DLL on yksi vähemmän, ohjelma voi ilmoittaa poikkeuksen, kuten alla olevassa kuvassa näkyy:
Alla oleva linkki on aiempi käyttökerta (ei suositeltavaa)
Käyttämällä Costura.Fody -työkalua voit yhdistää lähde-DLL:n kohde-EXE:hen
Projektin kotisivu: https://github.com/Fody/Costura
Miten käyttää ja asentaa nuget-paketti suoraan:
Kun olet onnistuneesti lisännyt Costura.Fodyn, ratkaisu lisää automaattisesti FodyWeavers.xml tiedoston.
Generoi ratkaisu uudelleen, näet onnistumisesi ohjelman generointihakemistossa, kaikki DLL:t on täydellisesti yhdistetty exe-tiedostoon, voit kopioida exe-tiedoston suoraan asiakkaaseen itsenäisesti suoritettavaksi. Kuten alla on esitetty:
1>------ Kaikki uudelleenrakennukset on aloitettu: Projekti: itsvse, Konfiguraatio: Debug Mikä tahansa prosessori ------ 1> Fody: Fody (versio 2.0.0.0) Suoritus 1> Fody/Costura: Ei viittausta 'Costura.dll'-sanaan. Lähteitä ei muutettu. 1> Fody/Costura: Upotetaan 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Upotetaan 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Sain valmiiksi Fody 609ms. 1> Fody: Vahvistuskokoonpano ohitettiin koska se on poistettu käytöstä konfiguraatiossa 1> Fody: Vahvistus valmis 3 sekunnissa. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regenerate kaikki: 1 onnistuu, 0 epäonnistuu ja 0 ========== ohitettu
Kuten yllä olevasta kuvasta näkyy, generoitu tiedosto ei sisällä Newtonsoft.Json.dll, HttpHelper.dll ja Costura.dll ei ole generoitu, vaan vain kaksi tiedostoa, itsvse.exe voidaan ajaa suoraan ilman virheitä! (PDB-tiedosto voidaan poistaa).
Käytetään ILSpy-työkalua ohjelman purkamiseen ja tarkastellaan generoitua lähdekoodia, kuten alla olevassa kuvassa näkyy:
Johdanto toteutusperiaatteeseen
Kun CLR yrittää ladata assemblyn mutta ei lataudu, se käynnistää AppDomain.AssemblyResolve-tapahtuman. Ohjelmamme voi kuunnella tätä tapahtumaa ja palauttaa assemblerin, jonka CLR yrittää ladata tapahtumankäsittelijässä, jotta ohjelma voi jatkaa normaalia toimintaa.
Fody.Costura upottaa kaikki EXE:n viitaamat DLL:t EXE-tiedostoon projektin rakentamisen yhteydessä. Kun ohjelma käyttää jotakin näistä DLL-tiedostoista suorituksen aikana (AppDomain.AssemblyResolve-tapahtuma käynnistyy, koska CLR ei löydä DLL-tiedostoa), tarvittava DLL poimitaan EXE-tiedoston upotetuista resursseista.
Näet, että Liittä-metodi kuuntelee AppDomain.AssemblyResolve-tapahtumaa. Kun CLR ei lataa assemblyä onnistuneesti, AssemblyResolve-tapahtumankäsittelijä suoritetaan. AssemblyResolve yrittää saada kohdeassemblyn ladatun assemblyn upotetusta resurssista Common.ReadFromEmbeddedResources -menetelmällä ja palauttaa sen CLR:ään.
Tämän nähdessäsi saatat kysyä, milloin Liitte-menetelmä otettiin käyttöön?
Itse asiassa C#-kielessä CLR kätkee suuren tempun – CLR voi suorittaa alustettua koodia ennen kuin jokainen moduuli (jokainen kokoonpano sisältää yhden tai useamman moduulin) on ladattu. Valitettavasti C#-kieli ei hallitse tätä koodiosaa. Fody.Costura injektoi IL-koodin suoraan EXE-kokoonpanon sisäisen moduulin alustusfunktioon, ja tämä osa IL-koodista suorittaa itse asiassa Atmate-metodin. Näin, kun EXE-kokoonpano on ladattu, Liitte-menetelmä voidaan kutsua välittömästi.
Yllä oleva on lyhyt johdanto Fody.Costuran toteutusperiaatteeseen.
Edistynyt konfiguraatio
Nämä asetukset lisätään tai muokataan CosturaFodyWeavers.xml tiedostoissa.
CreateTemporaryAssemblies Oletuksena: väärä Tämä upottaa upotetun tiedoston levylle ennen sen lataamista muistiin. Tämä on hyödyllistä tietyissä tilanteissa, joissa haluat ladata assemblyn fyysisestä tiedostosta.
IncludeDebugSymbols Oletuksena: tosi Ohjaa, ovatko viitekokoonpanon .pdb-tiedostot myös upotettuina.
DisableCompression Oletuksena: väärä Upotetut kokoonpanot pakataan oletuksena ja puretaan ladattaessa. Voit poistaa pakkauksen käytöstä tällä vaihtoehdolla. Huomautus: Muista poistaa tämä ominaisuus käytöstä, kun viittaat ei-standardeihin DLL-tiedostoihin tai salattuihin DLL-tiedostoihin. Muuten se johtaa tilanteeseen, jossa exe:tä ei voi avata. Tämä havaittiin, kun käytin DSkin.dll.
DisableCleanup Oletuksena: väärä Osana Costuraa upotetut komponentit eivät enää sisälly kokoonpanoon. Tämän siivouksen voi kytkeä pois päältä.
LoadAtModuleInit Oletuksena: tosi Costura ladataan oletuksena osana moduulin alustamista. Lippu poistaa käyttäytymisen käytöstä. Varmista, että voit käyttää CosturaUtility.Initialize():ta jossain.
ExcludeAssemblyt Näin käytetään: ExcludeAssemblies="DLL1| DLL2" Lista assembly-nimistä, jotka poistetaan oletustoiminnosta "upota kaikki kopioi paikalliset viitteet".
IncludeAssemblies Näin käytetään: IncludeAssemblies="DLL1| DLL2" Luettelo kokoonpanojen nimistä, jotka sisältyvät oletustoimintoon Upotus Kaikki kopioi paikalliset viitteet.
Unmanaged32Assemblies&Unmanaged64Assemblies Miten sitä käytetään: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Sekatilakokoonpanoja ei voi ladata samalla tavalla kuin hallittuja kokoonpanoja. Siksi, jotta Costura tunnistaisi, mitkä komponentit ovat sekatilassa ja missä ympäristöissä ne ladataan, niiden nimet tulisi sisällyttää yhteen tai molempiin listoihin. Älä sisällytä nimeen .exe tai .dll.
PreloadOrder Käyttö: PreloadOrder="DLL1| DLL2" Paikalliset kirjastot voidaan ladata automaattisesti Cosuran toimesta. Jos haluat lisätä paikallisen kirjaston, sisällytä se projektiisi upotettuna resurssina, jota kutsutaan kansioksi costura32 tai costura64 riippuen kirjaston epävakaudesta. Vaihtoehtoisesti voit määrittää latausjärjestyksen, jossa esiladatut kirjastot ladataan. Kun sekoitat väliaikaisia komponentteja levyltä, nekin ovat valmiiksi ladattuja.
CosturaUtility Näin käytetään:
CosturaUtility on luokka, jonka avulla voit manuaalisesti käynnistää Costura-järjestelmän omassa koodissasi.Tämä koskee pääasiassa tilanteita, joissa moduulin alustusohjelma ei toimi, kuten kirjastot ja mono.
Lopuksi lataa lähdekoodi tekstistä:
Turistit, jos haluatte nähdä tämän postauksen piilotetun sisällön, olkaa hyvä Vastaus
|