Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 219600|Svar: 43

[WinForm] .net/c# Brug Costura.Fody til at pakke DLL'en ind i EXE'en

[Kopier link]
Opslået på 14/04/2018 14.41.49 | | | |
Winform/wpf-udvikling refererer uundgåeligt til mange tredjeparts DLL'er, men hver gang du pakker det, skal du kopiere filerne i Debug-mappen til kunden eller dele dem, hvilket ikke er særlig praktisk at bruge. Jeg har prøvet flere programmer til at merge dll-filer før, såsom ILMerge, Enigma Virtual Box osv., men indtil jeg lærte om "Costura.Fody", følte jeg, at verden var meget bedre~

Følgende er et program skrevet af Winform, der refererer til de to DLL'er "HttpHelper.dll" og "Newtonsoft.Json.dll"; når vi genererer programmet, vil der være en exe-fil og disse to DLL-filer, hvilket gør folk meget utilpasse, og hvis der er én DLL mindre, kan programmet rapportere en undtagelse, som vist i figuren nedenfor:



Linket nedenfor viser den tidligere brug (ikke anbefalet)

C# pakker dll'en ind i exe'ens program
http://www.itsvse.com/thread-2841-1-1.html
(Kilde: Architect_Programmer)



Ved at bruge Costura.Fody-værktøjet kan du merge kilde-DLL'en ind i mål-EXE'en

Projekthjemmeside: https://github.com/Fody/Costura

Sådan bruger du nuget-pakken direkte og installerer:



Når du har tilføjet Costura.Fody med succes, vil løsningen automatisk tilføje FodyWeavers.xml fil.

Gengenerer løsningen, du kan se din succes i programgenereringsmappen, alle DLL'erne er perfekt flettet ind i exe'en, du kan direkte kopiere exe-filen til klienten for at køre den uafhængigt. Som vist nedenfor:

1>------ Alle genopbygninger er startet: Projekt: itsvse, Konfiguration: Debug enhver CPU ------
1> Fody: Fody (version 2.0.0.0) Udfører
1> Fody/Costura: Ingen reference til 'Costura.dll' fundet. Referencer ikke ændret.
1> Fody/Costura: Indlejring af 'E:\project\itsvse\itsvse\HttpHelper.dll'
1> Fody/Costura: Indlejring af 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll'
1> Fody: Færdiggjorde Fody 609ms.
1> Fody: Sprung Verificering af assembly over, da den er deaktiveret i konfigurationen
1> Fody: Færdig med verifikationen på 3 ms.
1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe
========== Regenerer alle: 1 lykkes, 0 fejler, og 0 ========== springer over





Som det kan ses på billedet ovenfor, indeholder den genererede fil ikke Newtonsoft.Json.dll, HttpHelper.dll og Costura.dll er ikke genereret, kun to filer, itsvse.exe kan køres direkte uden fejl! (PDB-filen kan slettes).

Lad os bruge ILSpy-værktøjet til at dekompilere vores program og se på den genererede kildekode, som vist i figuren nedenfor:



Introduktion til implementeringsprincippet

Når CLR forsøger at indlæse en assembly, men fejler i at indlæse, åbner den AppDomain.AssemblyResolve-hændelsen. Vores program kan lytte efter denne begivenhed og returnere den assembly, som CLR'en forsøger at indlæse i event handleren, så programmet kan fortsætte med at fungere normalt.

Fody.Costura indlejrer alle DLL'erne, som EXE'en refererer til, i EXE-filen, når projektet bygges. Når et program bruger en af disse DLL'er under udførelsen (AppDomain.AssemblyResolve-begivenheden udløses, fordi CLR ikke kan finde DLL-filen), udtrækkes den nødvendige DLL fra de indlejrede ressourcer i EXE-filen.


Du kan se, at Attacte-metoden lytter til AppDomain.AssemblyResolve-begivenheden. Når CLR ikke indlæser en assembly korrekt, udføres AssemblyResolve-hændelseshåndteren. AssemblyResolve forsøger at hente målsamlingen fra den indlæste assemblys indlejrede ressource via Common.ReadFromEmbeddedResources-metoden og returnerer den til CLR.

Når du ser dette, spørger du måske, hvornår blev Atte-metoden implementeret?

Faktisk skjuler CLR for C#-sproget et stort trick – CLR kan køre noget initialiseret kode, før hvert modul (hver assembly indeholder en eller flere moduler) indlæses. Desværre har C#-sproget ingen kontrol over denne del af koden. Fody.Costura indsætter IL-kode direkte i initialiseringsfunktionen af det interne modul i EXE-samlingen, og denne del af IL-koden udfører faktisk Attach-metoden. På denne måde kan Atte-metoden kaldes med det samme, når EXE-samlingen er indlæst.

Ovenstående er en kort introduktion til implementeringsprincippet i Fody.Costura.


Avanceret konfiguration

Disse konfigurationer tilføjes eller ændres i CosturaFodyWeavers.xml filer.

CreateTemporaryAssemblies
Standard: falsk
Dette indlejrer den indlejrede fil i disken, før den indlæses i hukommelsen. Dette er nyttigt i visse situationer, hvor du vil indlæse en assembly fra en fysisk fil.

IncludeDebugSymbols
Standard: sandt
Styrer, om .pdb'erne i referencesamlingen også er indlejret.

DisableKompression
Standard: falsk
Indlejrede samlinger komprimeres som standard og ikke komprimeres, når de indlæses. Du kan slå kompression fra ved at bruge denne mulighed.
Bemærk: Sørg for at slå denne egenskab fra, når du refererer til ikke-standard DLL'er eller krypterede DLL'er. Ellers vil det føre til, at exe-filen ikke kan åbnes. Det blev opdaget, da jeg brugte DSkin.dll.

DisableCleanup
Standard: falsk
Som en del af Costura er indlejrede komponenter ikke længere inkluderet i buildet. Denne oprydning kan slås fra.

LoadAtModuleInit
Standard: sandt
Costura indlæses som standard som en del af module-initialiseringen. Flaget deaktiverer adfærden. Sørg for, at du kan bruge CosturaUtility. Initialize() et sted.

EksklusiveForsamlinger
Sådan bruger du: ExcludeAssemblies="DLL1| DLL2"
En liste over assemblynavne, der skal udelukkes fra standardhandlingen "indlejr alle lokale referencer".

InkludérForsamlinger
Sådan bruger du: IncludeAssemblies="DLL1| DLL2"
En liste over assemblynavne inkluderet i standardhandlingen Embedding All Copy Local References.

Unmanaged32Assemblies&Unmanaged64Assemblies
Sådan bruger du det: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2"
Mixed-mode assemblies kan ikke indlæses på samme måde som managed assemblies. Derfor bør deres navne inkluderes i en eller begge lister for at hjælpe Costura med at identificere, hvilke komponenter der er i blandet tilstand, og i hvilke miljøer de skal indlæses. Inkluder ikke .exe eller .dll i navnet.

PreloadOrder
Brug: PreloadOrder="DLL1| DLL2"
Lokale biblioteker kan automatisk indlæses af Costura. For at inkludere et lokalt bibliotek, inkluder det i dit projekt som en indlejret ressource kaldet en mappe costura32 eller costura64, afhængigt af bibliotekets ustabilitet. Alternativt kan du angive den rækkefølge, hvori de forudindlæste biblioteker indlæses. Når du blander midlertidige komponenter fra disken, bliver de også forudindlæst.

CosturaUtility
Sådan bruger du:




CosturaUtility er en klasse, der giver dig mulighed for manuelt at initialisere Costura-systemet i din egen kode.Dette gælder primært for scenarier, hvor modulinitialiseringsprogrammet ikke virker, såsom biblioteker og Mono.


Endelig downloader du kildekoden i teksten:

Turister, hvis I vil se det skjulte indhold i dette indlæg, så vær venligSvar





Tidligere:StreamReader-løsning til forvrængede tegn ved fillæsning
Næste:Løsninger på konflikter mellem Hyper-V og VirtualBox og VMware
Opslået på 07/06/2018 09.35.19 |
Prøv denne metode med at integrere afhængighedskomponent Dll i C# kompileret EXE!

Hvis det er nemt at bruge, så husk at rose det! Haha, det her, bare tilføj Dll til ressourcefilen, simpelt og praktisk! (Jeg forstår det ikke, jeg kan finde på en tutorial) @小渣渣

 Udlejer| Opslået på 06/06/2018 10.30.42 |
Hvis du underskriver et program, vil du modtage følgende fejl:

1>MSBUILD : fejl : Fody: En unhandled-undtagelse opstod:
1>MSBUILD : fejl : Undtagelse:
1>MSBUILD: fejl: Kan ikke få en offentlig nøgle til StrongNameKeyPair.
1>MSBUILD : fejl : StackTrace:
1>MSBUILD: fejl: at System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: fejl: i System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: fejl: i Mono.Cecil.ModuleWriter.WriteModuleTo(ModuleDefinition-modul, Disposable'1-stream, WriterParameters-parametre)
1>MSBUILD: fejl: i Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters)
1>MSBUILD: fejl: I InnerWeaver.WriteModule() position C:\projects\fody\FodyIsolated\ModuleWriter.cs: linje nummer 18
1>MSBUILD: error: In InnerWeaver.Execute() position C:\projects\fody\FodyIsolated\InnerWeaver.cs: linjenummer 86
1>MSBUILD : fejl : Kilde:
1>MSBUILD : fejl : mscorlib
1>MSBUILD : fejl : TargetSite:
1>MSBUILD : error : Byte[] ComputePublicKey()
1>MSBUILD : fejl :
1> Fody: Færdiggjorde Fody 551ms.


Der synes ikke at være nogen løsning, se artiklen:

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

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


Stol ikke på stærke navne for at være sikker.

Så det virker meningsløst at gå den ekstra mil for at beskytte noget, der ikke er en sikkerhedsfunktion

 Udlejer| Opslået på 17/04/2018 13.02.12 |
xxhh Opslået den 2018-4-17 11:35
Efter at have installeret Costura.Fody direkte i vs NuGet, trak jeg en Windows Media Playe-afspiller for at generere to indbyggede dll'er til at slette eller rapportere ...

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

1: Du bør se, om "Costura.Fody" understøtter "com components"
2: Ignorer de to DLL'er, der er pakket, for hvordan man ignorerer xml skal sættes, se venligst den officielle dokumentation for detaljer
Opslået på 17/04/2018 10.29.52 |
Download for at se XML-konfigurationen
Opslået på 17/04/2018 10.33.34 |
Ejeren vil spørge dig, om jeg kan få videoen og dll samlet i et exe-plugin
 Udlejer| Opslået på 17/04/2018 11.16.15 |
xxhh Opslået den 2018-4-17 10:33
Ejeren vil spørge dig, om jeg kan få videoen og dll samlet i et exe-plugin
...

Du kan gøre dette, du kan sætte video-egenskaben til "Embedded Resources" og derefter læse ressourcefilen.
Opslået på 17/04/2018 11.35.51 |
Xiao Zhao postet den 17-4-2018 kl. 11:16
Du kan gøre dette, du kan sætte video-egenskaben til "Embedded Resources" og derefter læse ressourcefilen. ...

Jeg trak en Windows Media Playe-afspiller direkte efter installationen af Costura.Fody i vs NuGet og lavede to indbyggede dll'er til at slette eller rapportere en fejl  
Opslået på 17/04/2018 11.57.09 |
Skal XML stadig sættes?     
Opslået på 17/04/2018 17.42.31 |
Xiao Zhao postet den 17-4-2018 kl. 11:16
Du kan gøre dette, du kan sætte video-egenskaben til "Embedded Resources" og derefter læse ressourcefilen. ...

Udlejer eller mig, jeg vil spørge, jeg lægger videoen ind i den indlejrede ressource, det der læses ud, er et byte-array, er der nogen måde at lægge det i afspilleren og afspille det direkte (jeg vil ikke skrive til det lokale for at afspille i læsestien, videoen er mere end det store kort)
 Udlejer| Opslået på 17/04/2018 20.52.16 |
xxhh Opslået den 2018-4-17 17:42
Udlejer eller mig, jeg vil gerne spørge, jeg lægger videoen ind i den indlejrede ressource, og det, der læses ud, er et byte-array, er der nogen måde at lægge det i afspilleren og afspille det direkte ( ...

Det anbefales ikke at lave en stor video til en ressourcefil, du kan se, om der er en anden måde for afspilleren at sende byte direkte ind[]
Opslået på 18/04/2018 08.08.48 |
Xiao Zhazha Opslået den 17-4-2018 kl. 20:52
Det anbefales ikke at lave en stor video til en ressourcefil, du kan se, om der er en anden måde for afspilleren at sende byte direkte ind[] ...

Ingen af dem læser videoadresser og vil spørge dig, hvilke gode idéer du har
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com