Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 219600|Antwoord: 43

[WinForm] .net/c# Gebruik Costura.Fody om de DLL in de EXE te verpakken

[Link kopiëren]
Geplaatst op 14-04-2018 14:41:49 | | | |
Winform/wpf-ontwikkeling verwijst onvermijdelijk naar veel derdepartij DLL's, maar elke keer dat je het pakkett, moet je de bestanden in de Debug-map naar de klant kopiëren of delen, wat niet erg handig is om te gebruiken. Ik heb eerder verschillende software geprobeerd om dll-bestanden samen te voegen, zoals ILMerge, Enigma Virtual Box, enzovoort, maar totdat ik over "Costura.Fody" hoorde, vond ik de wereld veel beter~

Het volgende is een programma geschreven door Winform, dat verwijst naar de twee DLL's van "HttpHelper.dll" en "Newtonsoft.Json.dll"; wanneer we het programma genereren, is er een exe-bestand en deze twee DLL-bestanden, wat mensen erg ongemakkelijk maakt, en als er één DLL minder is, kan het programma een uitzondering rapporteren, zoals te zien is in de onderstaande figuur:



De onderstaande link toont het vorige gebruik (niet aanbevolen)

C# verpakt de dll in het exe-programma
http://www.itsvse.com/thread-2841-1-1.html
(Bron: Architect_Programmer)



Met de Costura.Fody-tool kun je de bron-DLL samenvoegen in de doel-EXE

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

Hoe gebruik je het Nuget-pakket direct te installeren:



Zodra je Costura.Fody succesvol hebt toegevoegd, voegt de oplossing automatisch FodyWeavers.xml bestand toe.

Genereer de oplossing opnieuw, je ziet je succes in de map met programmageneratie, alle DLL's zijn perfect samengevoegd in de exe, je kunt het exe-bestand direct naar de client kopiëren om het onafhankelijk uit te voeren. Zoals hieronder getoond:

1>------ Alle rebuilds zijn gestart: Project: itsvse, Configuratie: Debug Elke CPU ------
1> Fody: Fody (versie 2.0.0.0) Uitvoerend
1> Fody/Costura: Geen verwijzing naar 'Costura.dll' gevonden. Referenties niet gewijzigd.
1> Fody/Costura: Embedding 'E:\project\itsvse\itsvse\HttpHelper.dll'
1> Fody/Costura: 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' inbedden
1> Fody: Voer 609ms af.
1> Fody: Verificatie van assembly overgeslagen omdat deze in configuratie is uitgeschakeld
1> Fody: Verificatie afgerond in 3 ms.
1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe
========== Regenereer allemaal: 1 slaagt, 0 faalt, en 0 ========== overgeslagen





Zoals te zien is op de bovenstaande afbeelding, bevat het gegenereerde bestand geen Newtonsoft.Json.dll, HttpHelper.dll en Costura.dll worden niet gegenereerd, slechts twee bestanden, itsvse.exe direct zonder fouten kunnen worden uitgevoerd! (Het PDB-bestand kan worden verwijderd).

Laten we de ILSpy-tool gebruiken om ons programma te decompileren en de gegenereerde broncode bekijken, zoals weergegeven in de onderstaande figuur:



Inleiding tot het implementatieprincipe

Wanneer de CLR probeert een assembly te laden maar niet lukt, wordt het AppDomain.AssemblyResolve-event opgeroepen. Ons programma kan naar dit event luisteren en de assembly teruggeven die de CLR probeert te laden in de event handler zodat het programma normaal kan blijven functioneren.

Fody.Costura embed alle DLL's waarnaar de EXE verwijst in het EXE-bestand bij het bouwen van het project. Wanneer een programma een van deze DLL's gebruikt tijdens de uitvoering (de AppDomain.AssemblyResolve-gebeurtenis wordt geactiveerd omdat de CLR het DLL-bestand niet kan vinden), wordt de vereiste DLL geëxtraheerd uit de ingebedde bronnen van het EXE-bestand.


Je kunt zien dat de Atte-methode luistert naar het AppDomain.AssemblyResolve-evenement. Wanneer de CLR er niet in slaagt een assembly succesvol te laden, wordt de AssemblyResolve-gebeurtenishandler uitgevoerd. AssemblyResolve probeert de doelassemblage te halen uit de embedded resource van de geladen assembly via de Common.ReadFromEmbeddedResources-methode en retourneert deze naar de CLR.

Gezien dit vraag je je misschien af: wanneer werd de Atte-methode geïmplementeerd?

Voor de C#-taal verbergt de CLR een grote truc - de CLR kan wat geïnitialiseerde code uitvoeren voordat elke module (elke assembly bevat één of meer modules) wordt geladen. Helaas heeft de C#-taal geen controle over dit deel van de code. Fody.Costura injecteert IL-code direct in de initialisatiefunctie van de interne module van de EXE-assembly, en dit deel van de IL-code voert daadwerkelijk de Atte-methode uit. Op deze manier kan, zodra de EXE-assembly is geladen, de Atte-methode direct worden aangeroepen.

Bovenstaande is een korte introductie tot het implementatieprincipe van Fody.Costura.


Geavanceerde configuratie

Deze configuraties worden toegevoegd of aangepast in CosturaFodyWeavers.xml bestanden.

CreateTemporaryAssemblies
Standaard: onwaar
Dit sluit het ingesloten bestand in de schijf in voordat het in het geheugen wordt geladen. Dit is handig in bepaalde situaties waarin je een assembly vanuit een fysiek bestand wilt laden.

IncludeDebugSymbols
Standaard: waar
Bepaalt of de .pdbs van de referentieassembly ook zijn ingebed.

DisableCompressie
Standaard: onwaar
Embedded assemblies zijn standaard gecomprimeerd en niet gecomprimeerd wanneer ze geladen zijn. Je kunt compressie uitschakelen met deze optie.
Let op: Zorg ervoor dat je deze eigenschap uitschakelt bij het verwijzen naar niet-standaard DLL's of versleutelde DLL's. Anders leidt het ertoe dat de exe niet meer geopend kan worden. Dit ontdekte ik toen ik DSkin.dll gebruikte.

DisableCleanup
Standaard: onwaar
Als onderdeel van Costura zijn embedded componenten niet langer inbegrepen in de build. Deze schoonmaak kan worden uitgeschakeld.

LoadAtModuleInit
Standaard: waar
Costura wordt standaard geladen als onderdeel van module-initialisatie. De vlag schakelt het gedrag uit. Zorg dat je CosturaUtility kunt gebruiken. Initialiseren() ergens.

ExcludeAssemblies
Hoe te gebruiken: ExcludeAssemblies="DLL1| DLL2"
Een lijst met assemblynamen die uitgesloten moet worden van de standaardactie "embed all copy local references".

IncludeAssemblies
Hoe te gebruiken: IncludeAssemblies="DLL1| DLL2"
Een lijst van assemblynamen opgenomen in de standaardactie van Alle Copy Local References Embedding.

Unmanaged32Assemblies&Unmanaged64Assemblies
Hoe gebruik je het: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2"
Gemengde assemblages kunnen niet op dezelfde manier worden geladen als beheerde assemblies. Daarom moeten Costura helpen identificeren welke componenten in gemengde modus zijn en in welke omgevingen ze geladen moeten worden, hun namen in één of beide lijsten worden opgenomen. Neem geen .exe of .dll in de naam op.

PreloadOrder
Gebruik: PreloadOrder="DLL1| DLL2"
Lokale bibliotheken kunnen automatisch door Cosura worden geladen. Om een lokale bibliotheek op te nemen, neem deze op in je project als een embedded bron, genaamd een map costura32 of costura64, afhankelijk van de instabiliteit van de bibliotheek. Alternatief kun je de laadvolgorde specificeren waarin de vooraf geladen bibliotheken worden geladen. Wanneer je tijdelijke componenten van de schijf mengt, zijn ze ook vooraf geladen.

CosturaUtility
Hoe te gebruiken:




CosturaUtility is een klasse waarmee je het Costura-systeem handmatig kunt initialiseren in je eigen code.Dit geldt vooral voor situaties waarin het module-initialisatieprogramma niet werkt, zoals bibliotheken en Mono.


Download tenslotte de broncode in de tekst:

Toeristen, als jullie de verborgen inhoud van dit bericht willen zien, alsjeblieftAntwoord





Vorig:StreamReader-oplossing voor onverstaanbare tekens bij het lezen van bestanden
Volgend:Oplossingen voor conflicten tussen Hyper-V en VirtualBox en VMware
Geplaatst op 07-06-2018 09:35:19 |
Probeer deze methode om afhankelijkheidscomponent Dll te integreren in C# gecompileerde EXE!

Als het makkelijk te gebruiken is, vergeet dan niet het te prijzen! Haha, dit, gewoon Dll toevoegen aan het resourcebestand, simpel en praktisch! (Ik snap het niet, ik kan wel een tutorial bedenken) @小渣渣

 Huisbaas| Geplaatst op 06-06-2018 10:30:42 |
Als je een programma ondertekent, krijg je de volgende foutmelding:

1>MSBUILD : fout : Fody: Er is een niet-behandelde uitzondering opgetreden:
1>MSBUILD : fout : Uitzondering:
1>MSBUILD: fout: Kan geen publieke sleutel voor StrongNameKeyPair krijgen.
1>MSBUILD : fout : StackTrace:
1>MSBUILD: fout: bij System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: fout: in System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: fout: in Mono.Cecil.ModuleWriter.WriteModuleTo(ModuleDefinition-module, Disposable'1-stream, WriterParameters-parameters)
1>MSBUILD: fout: in Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters)
1>MSBUILD: fout: In InnerWeaver.WriteModule() positie C:\projects\fody\FodyIsolated\ModuleWriter.cs: regel nummer 18
1>MSBUILD: fout: In InnerWeaver.Execute() positie C:\projects\fody\FodyIsolated\InnerWeaver.cs: regel nummer 86
1>MSBUILD : fout : Bron:
1>MSBUILD : fout : mscorlib
1>MSBUILD : fout : TargetSite:
1>MSBUILD : fout : Byte[] ComputePublicKey()
1>MSBUILD : fout :
1> Fody: Fody 551ms afgemaakt.


Er lijkt geen oplossing te zijn, zie het artikel:

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

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


Vertrouw niet op sterke namen om veilig te blijven.

Dus het lijkt zinloos om een stapje extra te zetten om iets te beschermen dat geen beveiligingsfunctie is

 Huisbaas| Geplaatst op 17-04-2018 13:02:12 |
xxhh Geplaatst op 2018-4-17 11:35
Na het direct installeren van Costura.Fody in vs NuGet sleepte ik een Windows Media Playe-speler om twee ingebouwde dll's te genereren om te verwijderen of te rapporteren ...

Windows Media Player-besturingen zijn com-componenten, ik weet niet of "Costura.Fody" die ondersteunt.

1: Je moet kijken of "Costura.Fody" "com-componenten" ondersteunt
2: Negeer de twee verpakte DLL's, wat betreft hoe je xml moet negeren, raadpleeg de officiële documentatie voor details
Geplaatst op 17-04-2018 10:29:52 |
Download om de XML-configuratie te bekijken
Geplaatst op 17-04-2018 10:33:34 |
De eigenaar wil je vragen of ik de video en dll samen kan krijgen in een exe-plugin
 Huisbaas| Geplaatst op 17-04-2018 11:16:15 |
xxhh Geplaatst op 2018-4-17 10:33
De eigenaar wil je vragen of ik de video en dll samen kan krijgen in een exe-plugin
...

Je kunt dit doen: je kunt de video-eigenschap instellen op "Embedded Resources" en vervolgens het resourcebestand lezen.
Geplaatst op 17-04-2018 11:35:51 |
Xiao Zhao plaatste op 2018-4-17 11:16
Je kunt dit doen: je kunt de video-eigenschap instellen op "Embedded Resources" en vervolgens het resourcebestand lezen. ...

Ik heb direct na het installeren van Costura.Fody in vs NuGet een Windows Media Playe-speler gesleept en twee ingebouwde dll's gemaakt om te verwijderen of een foutmelding te geven  
Geplaatst op 17-04-2018 11:57:09 |
Moet XML nog steeds worden ingesteld?     
Geplaatst op 17-04-2018 17:42:31 |
Xiao Zhao plaatste op 2018-4-17 11:16
Je kunt dit doen: je kunt de video-eigenschap instellen op "Embedded Resources" en vervolgens het resourcebestand lezen. ...

Verhuurder of ik, ik wil het vragen, ik zet de video in de embedded resource, wat wordt uitgegeven is een byte-array, is er een manier om het in de speler te zetten en het direct af te spelen (ik wil niet naar de lokale server schrijven om het af te spelen via het leespad, de video is meer dan alleen de grote kaart)
 Huisbaas| Geplaatst op 17-04-2018 20:52:16 |
xxhh Geplaatst op 2018-4-17 17:42
Verhuurder of ik, ik wil het vragen, ik zet de video in de ingebedde bron, en wat eruit wordt gelezen is een byte-array, is er een manier om het in de speler te zetten en het direct af te spelen ( ...

Het wordt niet aanbevolen om een grote video om te zetten in een resourcebestand, je kunt kijken of er een andere manier is waarop de speler direct byte kan doorgeven[]
Geplaatst op 18-04-2018 08:08:48 |
Xiao Zhazha Geplaatst op 17-4-2018 20:52
Het wordt niet aanbevolen om een grote video om te zetten in een resourcebestand; je kunt kijken of er een andere manier is waarop de speler direct byte[] ...

Geen van hen leest videoadressen en wil je vragen welke goede ideeën je hebt
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com