Die Entwicklung von Winform/wpf bezieht sich zwangsläufig auf viele DLLs von Drittanbietern, aber jedes Mal, wenn Sie sie verpacken, müssen Sie die Dateien im Debug-Verzeichnis an den Kunden kopieren oder teilen, was nicht sehr praktisch ist. Ich habe schon mehrere Programme ausprobiert, um DLL-Dateien zu kombinieren, wie ILMerge, Enigma Virtual Box usw., aber bis ich von "Costura.Fody" erfahren habe, hatte ich das Gefühl, dass die Welt viel besser ist~
Das Folgende ist ein von Winform geschriebenes Programm, das sich auf die beiden DLLs "HttpHelper.dll" und "Newtonsoft.Json.dll" bezieht; wenn wir das Programm generieren, gibt es eine EXE-Datei und diese beiden DLL-Dateien, was die Leute sehr unwohl fühlen lässt, und wenn eine DLL weniger ist, kann das Programm eine Ausnahme melden, wie in der untenstehenden Abbildung gezeigt:
Der untenstehende Link zeigt die vorherige Verwendung (nicht empfohlen)
Mit dem Tool Costura.Fody kannst du die Quell-DLL in die Ziel-EXE einfügen.
Projekt-Homepage: https://github.com/Fody/Costura
Wie man das Nuget-Paket direkt installiert:
Sobald Sie Costura.Fody erfolgreich hinzugefügt haben, fügt die Lösung automatisch FodyWeavers.xml Datei hinzu.
Regeneriere die Lösung, du kannst deinen Erfolg im Programmgenerierungsverzeichnis sehen, alle DLLs sind perfekt in die Exe eingefügt, du kannst die Exe-Datei direkt in den Client kopieren, um sie unabhängig auszuführen. Wie unten gezeigt:
1>------ Alle Überholungen wurden gestartet: Projekt: itsvse, Konfiguration: Debugging Jede CPU ------ 1> Fody: Fody (Version 2.0.0.0) Ausführung 1> Fody/Costura: Kein Hinweis auf 'Costura.dll' gefunden. Referenzen nicht verändert. 1> Fody/Costura: Einbettung von 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Einbettung von 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Fody 609 ms beendet. 1> Fody: Verifizierung der Assembly übersprungen, da sie in der Konfiguration deaktiviert ist 1> Fody: Verifizierung in 3 ms abgeschlossen. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Alle regenerieren: 1 gelingt, 0 scheitert und 0 ========== übersprungen
Wie auf dem obigen Bild zu sehen ist, enthält die generierte Datei keine Newtonsoft.Json.dll, HttpHelper.dll und Costura.dll werden nicht generiert, sondern nur zwei Dateien, itsvse.exe direkt fehlerfrei ausgeführt werden können! (Die PDB-Datei kann gelöscht werden).
Lassen Sie uns das ILSpy-Tool verwenden, um unser Programm zu dekompilieren und uns den generierten Quellcode ansehen, wie in der untenstehenden Abbildung gezeigt:
Einführung in das Implementierungsprinzip
Wenn die CLR versucht, eine Assembler zu laden, aber nicht lädt, wird das AppDomain.AssemblyResolve-Ereignis ausgelöst. Unser Programm kann auf dieses Ereignis hören und die Assembly, die der CLR zu laden versucht, im Ereignishandler zurückgeben, damit das Programm weiterhin normal funktionieren kann.
Fody.Costura bettet alle von der EXE referenzierten DLLs beim Bau des Projekts in die EXE-Datei ein. Wenn ein Programm während der Ausführung eine dieser DLLs verwendet (das AppDomain.AssemblyResolve-Ereignis wird ausgelöst, weil die CLR die DLL-Datei nicht finden kann), wird die erforderliche DLL aus den eingebetteten Ressourcen der EXE-Datei extrahiert.
Du siehst, dass die Attach-Methode das AppDomain.AssemblyResolve-Ereignis anhört. Wenn die CLR eine Assembly nicht erfolgreich lädt, wird der AssemblyResolve-Ereignishandler ausgeführt. AssemblyResolve versucht, die Ziel-Assembly über die Common.ReadFromEmbeddedResources-Methode von der eingebetteten Ressource der geladenen Assembly abzurufen und gibt sie an die CLR zurück.
Wenn Sie das sehen, fragen Sie sich vielleicht: Wann wurde die Attage-Methode implementiert?
Tatsächlich verbirgt die CLR in der C#-Sprache einen großen Trick – die CLR kann initialisierten Code ausführen, bevor jedes Modul (jede Assembler enthält ein oder mehrere Module) geladen wird. Leider hat die C#-Sprache keine Kontrolle über diesen Teil des Codes. Fody.Costura injiziert IL-Code direkt in die Initialisierungsfunktion des internen Moduls der EXE-Assembly, und dieser Teil des IL-Codes führt tatsächlich die Attach-Methode aus. So kann die Attachet-Methode sofort aufgerufen werden, sobald die EXE-Assembly geladen ist.
Das Obige ist eine kurze Einführung in das Umsetzungsprinzip von Fody.Costura.
Erweiterte Konfiguration
Diese Konfigurationen werden in CosturaFodyWeavers.xml Dateien hinzugefügt oder geändert.
CreateTemporaryAssemblies Standard: falsch Dadurch wird die eingebettete Datei auf die Festplatte eingebettet, bevor sie in den Speicher geladen wird. Das ist nützlich in bestimmten Szenarien, in denen du eine Assembly aus einer physischen Datei laden möchtest.
IncludeDebugSymbols Standard: wahr Kontrolliert, ob die .pdbs der Referenz-Assembly ebenfalls eingebettet sind.
DisableKompression Standard: falsch Eingebettete Baugruppen sind standardmäßig komprimiert und beim Laden nicht mehr komprimiert. Mit dieser Option kannst du die Kompression ausschalten. Hinweis: Schalten Sie diese Eigenschaft unbedingt aus, wenn Sie auf nicht-standardisierte DLLs oder verschlüsselte DLLs verweisen. Andernfalls führt es dazu, dass die Exe nicht geöffnet werden kann. Das wurde entdeckt, als ich DSkin.dll benutzt habe.
DisableCleanup Standard: falsch Im Rahmen von Cosura sind eingebettete Komponenten nicht mehr im Build enthalten. Diese Aufräumaktion kann ausgeschaltet werden.
LoadAtModuleInit Standard: wahr Costura wird standardmäßig als Teil der Modulinitialisierung geladen. Die Flagge deaktiviert das Verhalten. Stelle sicher, dass du CosturaUtility verwenden kannst. Initialize() irgendwo.
Exklusivversammlungen Wie man verwendet: ExcludeAssemblies="DLL1| DLL2" Eine Liste von Assemblernamen, die von der Standardaktion "alle lokalen Referenzen kopieren" ausgeschlossen werden sollten.
IncludeAssemblies Wie man verwendet: IncludeAssemblies="DLL1| DLL2" Eine Liste von Assemblernamen, die in der Standardaktion Einbetten aller lokalen Referenzen enthalten sind.
Unmanaged32Assemblies&Unmanaged64Assemblies Wie man es benutzt: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Mixed-Mode-Assemblies können nicht auf die gleiche Weise geladen werden wie verwaltete Assemblies. Um Costura zu helfen, herauszufinden, welche Komponenten sich im gemischten Modus befinden und in welchen Umgebungen geladen werden sollen, sollten ihre Namen in einer oder beiden Listen aufgeführt werden. Fügen Sie .exe oder .dll nicht im Namen hinzu.
PreloadOrder Verwendung: PreloadOrder="DLL1| DLL2" Lokale Bibliotheken können von Costura automatisch geladen werden. Um eine lokale Bibliothek einzubeziehen, fügen Sie sie in Ihr Projekt als eingebettete Ressource ein, die als Ordner costura32 oder costura64 bezeichnet wird, je nach Instabilität der Bibliothek. Alternativ kannst du die Ladereihenfolge angeben, in der die vorinstallierten Bibliotheken geladen werden. Wenn du temporäre Komponenten von der Festplatte mischst, werden sie ebenfalls vorgeladen.
CosturaUtility Wie man verwendet:
CosturaUtility ist eine Klasse, die es ermöglicht, das Costura-System manuell in deinem eigenen Code zu initialisieren.Dies gilt hauptsächlich für Szenarien, in denen das Modulinitialisierungsprogramm nicht funktioniert, wie Bibliotheken und Mono.
Laden Sie schließlich den Quellcode im Text herunter:
Touristen, wenn ihr den versteckten Inhalt dieses Beitrags sehen wollt, bitte Antwort
|