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)
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, alsjeblieft Antwoord
|