Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 219600|Vastaus: 43

[WinForm] .net/c# Käytä Costura.Fodya paketoidaksesi DLL:n EXE:hen

[Kopioi linkki]
Julkaistu 14.4.2018 14.41.49 | | | |
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)

C# pakkaa dll:n exe:n ohjelmaan
http://www.itsvse.com/thread-2841-1-1.html
(Lähde: Architect_Programmer)



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





Edellinen:StreamReader-ratkaisu sekaville merkeille tiedostoja lukiessa
Seuraava:Ratkaisuja Hyper-V:n, VirtualBoxin ja VMwaren välisiin ristiriitoihin
Julkaistu 7.6.2018 9.35.19 |
Kokeile tätä menetelmää riippuvuuskomponentti Dll:n integroimisesta C#:n käännettyyn EXE:hen!

Jos se on helppokäyttöinen, muista kehua sitä! Haha, tämä, lisää vain Dll resurssitiedostoon, yksinkertaista ja käytännöllistä! (En ymmärrä, voin keksiä tutoriaalin) @小渣渣

 Vuokraisäntä| Julkaistu 6.6.2018 10.30.42 |
Jos allekirjoitat ohjelman, saat seuraavan virheen:

1>MSBUILD : error : Fody: Tapahtui käsittelemätön poikkeus:
1>MSBUILD : virhe : Poikkeus:
1>MSBUILD: virhe: StrongNameKeyPairille julkista avainta ei saatu.
1>MSBUILD : virhe : StackTrace:
1>MSBUILD: virhe: System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: virhe: System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: error: in Mono.Cecil.ModuleWriter.WriteModuleTo(ModuleDefinition-moduuli, Disposable'1-virta, WriterParameters-parametrit)
1>MSBUILD: virhe: Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parametrit)
1>MSBUILD: error: In InnerWeaver.WriteModule() position C:\projects\fody\FodyIsolated\ModuleWriter.cs: rivinumero 18
1>MSBUILD: error: In InnerWeaver.Execute() position C:\projects\fody\FodyIsolated\InnerWeaver.cs: rivinumero 86
1>MSBUILD : virhe : Lähde:
1>MSBUILD : virhe : mscorlib
1>MSBUILD : virhe : TargetSite:
1>MSBUILD : error : Byte[] ComputePublicKey()
1>MSBUILD : virhe :
1> Fody: Sain valmiiksi Fody 551ms.


Vaikuttaa siltä, ettei ratkaisua ole, katso artikkeli:

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

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


Älä luota vahvoihin nimiin pysyäksesi turvassa.

Siksi tuntuu turhalta nähdä ylimääräistä vaivaa suojatakseen jotain, mikä ei ole turvallisuusominaisuus

 Vuokraisäntä| Julkaistu 17.4.2018 13.02.12 |
xxhh Julkaistu 2018-4-17 11:35
Kun asensin Costura.Fodyn suoraan NuGetin sijaan, raahasin Windows Media Playe -soittimen luodakseni kaksi sisäänrakennettua dll-tiedostoa poistettavaksi tai raportoitavaksi ...

Windows Media Playerin ohjaimet ovat com-komponentteja, en tiedä tukeeko "Costura.Fody" niitä.

1: Sinun pitäisi tarkistaa, tukeeko "Costura.Fody" "com-komponentteja"
2: Älä välitä kahdesta paketoidusta DLL:stä, ja xml:n ohittaminen pitäisi olla asetettu, katso virallisesta dokumentaatiosta lisätietoja varten
Julkaistu 17.4.2018 10.29.52 |
Lataa nähdäksesi XML-konfiguraatio
Julkaistu 17.4.2018 10.33.34 |
Omistaja haluaa kysyä, voinko saada videon ja dll:n yhteen exe-pluginiksi
 Vuokraisäntä| Julkaistu 17.4.2018 11.16.15 |
xxhh Julkaistu 2018-4-17 10:33
Omistaja haluaa kysyä, voinko saada videon ja dll:n yhteen exe-pluginiksi
...

Voit tehdä tämän, asettamalla videon ominaisuuden "Embedded Resources" ja lukemalla resurssitiedoston.
Julkaistu 17.4.2018 11.35.51 |
Xiao Zhao julkaisi 2018-4-17 klo 11:16
Voit tehdä tämän, asettamalla videon ominaisuuden "Embedded Resources" ja lukemalla resurssitiedoston. ...

Raahasin Windows Media Playe -soittimen suoraan Costura.Fodyn asentamisen jälkeen vs NuGetissa ja loin kaksi sisäänrakennettua DLL:ää poistaakseni tai raportoidakseen virheen  
Julkaistu 17.4.2018 11.57.09 |
Täytyykö XML vielä asettaa?     
Julkaistu 17.4.2018 17.42.31 |
Xiao Zhao julkaisi 2018-4-17 klo 11:16
Voit tehdä tämän, asettamalla videon ominaisuuden "Embedded Resources" ja lukemalla resurssitiedoston. ...

Vuokranantajalta tai minulta, haluan kysyä, laitan videon upotettuun resurssiin, joka näyttää tavutaulukon, onko mitään keinoa laittaa se soittimeen ja toistaa suoraan (en halua kirjoittaa paikalliselle toistettavaksi lukupolulle, video on enemmän kuin iso kortti)
 Vuokraisäntä| Julkaistu 17.4.2018 20.52.16 |
xxhh Julkaistu 17.4.2018 klo 17:42
Vuokranantajalta tai minulta, haluan kysyä, laitan videon upotettuun resurssiin, ja siitä lukee tavutaulukko, onko mitään keinoa laittaa se soittimeen ja toistaa suoraan ( ...

Suurta videota ei suositella muuttamaan resurssitiedostoksi, voit katsoa, onko soittimella muuta tapaa siirtää suoraan tavuna[]
Julkaistu 18.4.2018 8.08.48 |
Xiao Zhazha Julkaistu 2018-4-17 20:52
Ei suositella tehdä suuresta videosta resurssitiedostoa, voit katsoa, onko soittimella muuta tapaa siirtää suoraan tavu[] ...

Kukaan heistä ei lue videoita ja halua kysyä, mitä hyviä ideoita sinulla on
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com