Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 219600|Svare: 43

[WinForm] .net/c# Bruk Costura.Fody for å pakke DLL-en inn i EXE-en

[Kopier lenke]
Publisert på 14.04.2018 14:41:49 | | | |
Winform/wpf-utvikling refererer uunngåelig til mange tredjeparts DLL-er, men hver gang du pakker den, må du kopiere filene i Debug-katalogen til kunden eller dele dem, noe som ikke er særlig praktisk å bruke. Jeg har prøvd flere programmer for å slå sammen dll-filer før, som ILMerge, Enigma Virtual Box, osv., men før jeg lærte om "Costura.Fody", følte jeg at verden var mye bedre~

Følgende er et program skrevet av Winform, som refererer til de to DLL-ene "HttpHelper.dll" og "Newtonsoft.Json.dll"; når vi genererer programmet, vil det være en exe-fil og disse to DLL-filene, noe som gjør folk veldig ukomfortable, og hvis det er én DLL mindre, kan programmet rapportere et unntak, som vist i figuren under:



Lenken nedenfor viser tidligere bruk (ikke anbefalt)

C# pakker dll-filen inn i exe-programmet
http://www.itsvse.com/thread-2841-1-1.html
(Kilde: Architect_Programmer)



Ved å bruke verktøyet Costura.Fody kan du slå sammen kilde-DLL-en med mål-EXE-en

Prosjektets hjemmeside: https://github.com/Fody/Costura

Slik bruker du nuget-pakken direkte:



Når du har lagt til Costura.Fody, vil løsningen automatisk legge til FodyWeavers.xml fil.

Regenerer løsningen, du kan se suksessen din i programgenereringskatalogen, alle DLL-ene er perfekt flettet inn i exe-filen, du kan kopiere exe-filen direkte til klienten for å kjøre den uavhengig. Som vist nedenfor:

1>------ Alle ombygginger er startet: Prosjekt: itsvse, Konfigurasjon: Debug Enhver CPU-------
1> Fody: Fody (versjon 2.0.0.0) Kjører
1> Fody/Costura: Ingen referanse til 'Costura.dll' funnet. Referanser ikke endret.
1> Fody/Costura: Innebygd 'E:\project\itsvse\itsvse\HttpHelper.dll'
1> Fody/Costura: Embedding 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll'
1> Fody: Fullførte Fody 609 ms.
1> Fody: Hoppet over Verifying assembly siden den er deaktivert i konfigurasjonen
1> Fody: Fullførte verifiseringen på 3 ms.
1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe
========== Regenerer alle: 1 lykkes, 0 mislykkes, og 0 ========== hoppet over





Som man kan se på bildet over, inneholder ikke den genererte filen Newtonsoft.Json.dll, HttpHelper.dll og Costura.dll genereres ikke, bare to filer, itsvse.exe kan kjøres direkte uten feil! (PDB-filen kan slettes).

La oss bruke ILSpy-verktøyet til å dekompilere programmet vårt og se på den genererte kildekoden, som vist i figuren nedenfor:



Introduksjon til implementeringsprinsippet

Når CLR prøver å laste inn en assembly, men mislykkes, utløser den AppDomain.AssemblyResolve-hendelsen. Programmet vårt kan lytte etter denne hendelsen og returnere assembleren som CLR prøver å laste inn i hendelseshåndtereren, slik at programmet kan fortsette å fungere normalt.

Fody.Costura legger inn alle DLL-ene som refereres til av EXE-en i EXE-filen når prosjektet bygges. Når et program bruker en av disse DLL-ene under kjøring (AppDomain.AssemblyResolve-hendelsen utløses fordi CLR-en ikke finner DLL-filen), blir den nødvendige DLL-en hentet ut fra de innebygde ressursene i EXE-filen.


Du kan se at Attate-metoden lytter til AppDomain.AssemblyResolve-hendelsen. Når CLR ikke klarer å laste inn en assembly, kjøres AssemblyResolve-hendelseshåndtereren. AssemblyResolve forsøker å hente mål-assemblyen fra den lastede assemblyens innebygde ressurs via Common.ReadFromEmbeddedResources-metoden og returnerer den til CLR.

Når du ser dette, kan du spørre: Når ble Atte-metoden implementert?

Faktisk, for C#-språket, skjuler CLR et stort triks – CLR kan kjøre noe initialisert kode før hver modul (hver samling inneholder en eller flere moduler) lastes inn. Dessverre har ikke C#-språket kontroll over denne delen av koden. Fody.Costura injiserer IL-kode direkte inn i initialiseringsfunksjonen til den interne modulen i EXE-assemblyen, og denne delen av IL-koden utfører faktisk Attach-metoden. På denne måten, når EXE-enheten er lastet inn, kan Attac-metoden kalles umiddelbart.

Ovenfor er en kort introduksjon til implementeringsprinsippet i Fody.Costura.


Avansert konfigurasjon

Disse konfigurasjonene legges til eller endres i CosturaFodyWeavers.xml filer.

CreateTemporaryAssemblies
Standard: falsk
Dette legger inn den innebygde filen på disken før den lastes inn i minnet. Dette er nyttig i visse situasjoner hvor du vil laste inn en assembly fra en fysisk fil.

IncludeDebugSymbols
Standard: sann
Kontrollerer om .pdb-ene til referansesamlingen også er innebygd.

Deaktiverekompresjon
Standard: falsk
Innebygde sammenstillinger komprimeres som standard og ikke komprimeres når de lastes. Du kan slå av komprimering ved å bruke dette alternativet.
Merk: Husk å slå av denne egenskapen når du refererer til ikke-standard DLL-er, eller krypterte DLL-er. Ellers vil det føre til at exe-filen ikke kan åpnes. Dette oppdaget jeg da jeg brukte DSkin.dll.

DisableCleanup
Standard: falsk
Som en del av Costura er ikke lenger innebygde komponenter inkludert i bygget. Denne oppryddingen kan slås av.

LoadAtModuleInit
Standard: sann
Costura lastes som standard som en del av modulinitialisering. Flagget deaktiverer oppførselen. Sørg for at du kan bruke CosturaUtility. Initialize() et sted.

EksklusjonForsamlinger
Hvordan bruke: ExcludeAssemblies="DLL1| DLL2"
En liste over assemblernavn som skal utelukkes fra standardhandlingen "legg inn alle lokale referanser".

Inkludere forsamlinger
Hvordan bruke: IncludeAssemblies="DLL1| DLL2"
En liste over assemblernavn inkludert i standardhandlingen Embedding All Copy Local References.

Unmanaged32Assemblies&Unmanaged64Assemblies
Hvordan bruke den: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2"
Mixed-mode assemblies kan ikke lastes inn på samme måte som administrerte assemblies. Derfor, for å hjelpe Costura med å identifisere hvilke komponenter som er i blandet modus, og i hvilke miljøer de skal lastes inn, bør navnene deres inkluderes i en eller begge listene. Ikke inkluder .exe eller .dll i navnet.

PreloadOrder
Bruk: PreloadOrder="DLL1| DLL2"
Lokale biblioteker kan automatisk lastes inn av Costura. For å inkludere et lokalt bibliotek, inkluder det i prosjektet ditt som en innebygd ressurs kalt en mappe costura32 eller costura64, avhengig av bibliotekets ustabilitet. Alternativt kan du spesifisere lasterekkefølgen som de forhåndslastede bibliotekene lastes inn i. Når du blander midlertidige komponenter fra disken, er de også forhåndslastet.

CosturaUtility
Slik bruker du:




CosturaUtility er en klasse som lar deg manuelt initialisere Costura-systemet i din egen kode.Dette gjelder hovedsakelig scenarier der modulinitialiseringsprogrammet ikke fungerer, som biblioteker og Mono.


Til slutt, last ned kildekoden i teksten:

Turister, hvis dere vil se det skjulte innholdet i dette innlegget, vær så snillSvare





Foregående:StreamReader-løsning for utydelige tegn ved fillesing
Neste:Løsninger på konflikter mellom Hyper-V og VirtualBox og VMware
Publisert på 07.06.2018 09:35:19 |
Prøv denne metoden for å integrere avhengighetskomponent-Dll i C# kompilert EXE!

Hvis det er lett å bruke, husk å rose det! Haha, dette, bare legg til Dll i ressursfilen, enkelt og praktisk! (Jeg forstår ikke, jeg kan lage en veiledning) @小渣渣

 Vert| Publisert på 06.06.2018 10:30:42 |
Hvis du signerer et program, vil du motta følgende feil:

1>MSBUILD : feil : Fody: Et ubehandlet unntak oppsto:
1>MSBUILD : feil : Unntak:
1>MSBUILD: feil: Kan ikke hente en offentlig nøkkel for StrongNameKeyPair.
1>MSBUILD : feil : StackTrace:
1>MSBUILD: feil: ved System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: feil: i System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: feil: i Mono.Cecil.ModuleWriter.WriteModuleTo(ModuleDefinition-modul, Disposable'1-strøm, WriterParameters-parametere)
1>MSBUILD: feil: i Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters)
1>MSBUILD: feil: I InnerWeaver.WriteModule() posisjon C:\projects\fody\FodyIsolated\ModuleWriter.cs: linje nummer 18
1>MSBUILD: error: In InnerWeaver.Execute() posisjon C:\projects\fody\FodyIsolated\InnerWeaver.cs: linje nummer 86
1>MSBUILD : feil : Kilde:
1>MSBUILD : feil : mscorlib
1>MSBUILD : feil : TargetSite:
1>MSBUILD : error : Byte[] ComputePublicKey()
1>MSBUILD : feil :
1> Fody: Fullførte Fody 551 ms.


Det ser ikke ut til å finnes noen løsning, se artikkelen:

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

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


Ikke stol på sterke navn for å være trygg.

Så det virker meningsløst å gå den ekstra milen for å beskytte noe som ikke er en sikkerhetsfunksjon

 Vert| Publisert på 17.04.2018 13:02:12 |
xxhh Publisert 2018-4-17 11:35
Etter å ha installert Costura.Fody direkte i vs NuGet, dro jeg en Windows Media Playe-spiller for å generere to innebygde dll-filer for å slette eller rapportere ...

Windows Media Player-kontroller er com-komponenter, jeg vet ikke om "Costura.Fody" støtter dem.

1: Du bør sjekke om "Costura.Fody" støtter "com-komponenter"
2: Ignorer de to DLL-ene som er pakket, for hvordan man ignorerer xml bør være satt, vennligst se den offisielle dokumentasjonen for detaljer
Publisert på 17.04.2018 10:29:52 |
Last ned for å se XML-konfigurasjonen
Publisert på 17.04.2018 10:33:34 |
Eieren vil spørre deg om jeg kan få videoen og DLL-en sammen til en exe-plugin
 Vert| Publisert på 17.04.2018 11:16:15 |
xxhh Publisert 17.04.2018 kl. 10:33
Eieren vil spørre deg om jeg kan få videoen og DLL-en sammen til en exe-plugin
...

Du kan gjøre dette, du kan sette videoegenskapen til "Embedded Resources", og så lese ressursfilen.
Publisert på 17.04.2018 11:35:51 |
Xiao Zhao postet 17.04.2018 kl. 11:16
Du kan gjøre dette, du kan sette videoegenskapen til "Embedded Resources", og så lese ressursfilen. ...

Jeg dro en Windows Media Playe-spiller direkte etter å ha installert Costura.Fody i vs NuGet og laget to innebygde dll-filer for å slette eller rapportere en feil  
Publisert på 17.04.2018 11:57:09 |
Må XML fortsatt sattes?     
Publisert på 17.04.2018 17:42:31 |
Xiao Zhao postet 17.04.2018 kl. 11:16
Du kan gjøre dette, du kan sette videoegenskapen til "Embedded Resources", og så lese ressursfilen. ...

Utleier eller meg, jeg vil spørre, jeg legger videoen inn i den innebygde ressursen, det som leses ut er et byte-array, finnes det noen måte å legge det inn i spilleren og spille det direkte (jeg vil ikke skrive til lokal for å spille i lesebanen, videoen er mer enn det store kortet)
 Vert| Publisert på 17.04.2018 20:52:16 |
xxhh Publisert 2018-4-17 17:42
Utleier eller jeg, jeg vil spørre, jeg legger videoen inn i den innebygde ressursen, og det som leses ut er et byte-array, finnes det noen måte å legge det inn i spilleren og spille det direkte av ( ...

Det anbefales ikke å lage en stor video til en ressursfil, du kan se om det finnes en annen måte for spilleren å direkte sende inn byte[]
Publisert på 18.04.2018 08:08:48 |
Xiao Zhazha Publisert 17.04.2018 kl. 20:52
Det anbefales ikke å lage en stor video til en ressursfil, du kan se om det finnes noen annen måte for spilleren å direkte sende inn byte[] ...

Ingen av dem leser videoadresser og vil spørre deg hvilke gode ideer du har
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com