Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 219600|Antwort: 43

[WinForm] .net/c# Verwende Costura.Fody, um die DLL in die EXE zu packen

[Link kopieren]
Veröffentlicht am 14.04.2018 14:41:49 | | | |
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)

C# packt die DLL in das Programm der exe
http://www.itsvse.com/thread-2841-1-1.html
(Quelle: Architect_Programmer)



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, bitteAntwort





Vorhergehend:StreamReader-Lösung für verzerrte Zeichen beim Lesen von Dateien
Nächster:Lösungen für Konflikte zwischen Hyper-V und VirtualBox sowie VMware
Veröffentlicht am 07.06.2018 09:35:19 |
Probieren Sie diese Methode aus, um Abhängigkeitskomponenten-Dll in C# kompilierte EXE zu integrieren!

Wenn es einfach zu bedienen ist, denk daran, es zu loben! Haha, das, einfach Dll zur Ressourcendatei hinzufügen, einfach und praktisch! (Ich verstehe nicht, ich kann mir ein Tutorial ausdenken) @小渣渣

 Vermieter| Veröffentlicht am 06.06.2018 10:30:42 |
Wenn Sie ein Programm unterschreiben, erhalten Sie folgenden Fehler:

1>MSBUILD : Fehler : Fody: Eine unbehandelte Ausnahme ist aufgetreten:
1>MSBUILD : Fehler : Ausnahme:
1>MSBUILD: Fehler: Kein öffentlicher Schlüssel für StrongNameKeyPair erhalten.
1>MSBUILD : Fehler : StackTrace:
1>MSBUILD: fehler: bei System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: Fehler: in System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: fehler: in Mono.Cecil.ModuleWriter.WriteModuleTo(ModuleDefinition module, Disposable'1 stream, WriterParameters)
1>MSBUILD: fehler: in Mono.Cecil.ModuleDefinition.Write(String-Dateiname, WriterParameters)
1>MSBUILD: fehler: In InnerWeaver.WriteModule() Position C:\projects\fody\FodyIsolated\ModuleWriter.cs: Zeilennummer 18
1>MSBUILD: fehler: In InnerWeaver.Execute() Position C:\projects\fody\FodyIsolated\InnerWeaver.cs: Zeilennummer 86
1>MSBUILD : Fehler : Quelle:
1>MSBUILD : error : mscorlib
1>MSBUILD : Fehler : TargetSite:
1>MSBUILD : error : Byte[] ComputePublicKey()
1>MSBUILD : Fehler :
1> Fody: Fody 551 ms beendet.


Es scheint keine Lösung zu geben, siehe den Artikel:

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

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


Verlasse dich nicht auf starke Namen, um sicher zu bleiben.

Deshalb erscheint es sinnlos, die Extrameile zu gehen, um etwas zu schützen, das keine Sicherheitsfunktion ist

 Vermieter| Veröffentlicht am 17.04.2018 13:02:12 |
xxhh Veröffentlicht am 17.04.2018 11:35
Nachdem ich Costura.Fody direkt in vs NuGet installiert hatte, habe ich einen Windows Media Playe-Player gezogen, um zwei eingebaute DLLs zu generieren, die gelöscht oder gemeldet werden ...

Die Windows Media Player-Steuerung sind COM-Komponenten, ich weiß nicht, ob "Costura.Fody" sie unterstützt.

1: Du solltest prüfen, ob "Costura.Fody" "com-Komponenten" unterstützt.
2: Ignorieren Sie die beiden verpackten DLLs, und wie man XML ignorieren sollte, sollte für Details die offizielle Dokumentation nachgewiesen werden.
Veröffentlicht am 17.04.2018 10:29:52 |
Laden Sie herunter, um die XML-Konfiguration zu sehen
Veröffentlicht am 17.04.2018 10:33:34 |
Der Besitzer möchte dich fragen, ob ich das Video und die DLL in ein Exe-Plugin zusammenfügen kann
 Vermieter| Veröffentlicht am 17.04.2018 11:16:15 |
xxhh Veröffentlicht am 17.04.2018 10:33
Der Besitzer möchte dich fragen, ob ich das Video und die DLL in ein Exe-Plugin zusammenfügen kann
...

Das kannst du tun, du kannst die Video-Eigenschaft auf "Embedded Resources" setzen und dann die Ressourcendatei lesen.
Veröffentlicht am 17.04.2018 11:35:51 |
Xiao Zhao veröffentlichte am 17.04.2018, 11:16
Das kannst du tun, du kannst die Video-Eigenschaft auf "Embedded Resources" setzen und dann die Ressourcendatei lesen. ...

Ich habe direkt nach der Installation von Costura.Fody in vs NuGet einen Windows Media Playe-Player gezogen und zwei integrierte DLLs erstellt, um einen Fehler zu löschen oder einen Fehler zu melden  
Veröffentlicht am 17.04.2018 11:57:09 |
Muss XML noch eingestellt werden?     
Veröffentlicht am 17.04.2018 17:42:31 |
Xiao Zhao veröffentlichte am 17.04.2018, 11:16
Das kannst du tun, du kannst die Video-Eigenschaft auf "Embedded Resources" setzen und dann die Ressourcendatei lesen. ...

Vermieter oder ich, ich möchte fragen: Ich lege das Video in die eingebettete Ressource, was ausgelesen wird, ist ein Byte-Array. Gibt es eine Möglichkeit, es direkt in den Player zu legen und abzuspielen (ich möchte nicht zum lokalen Sender schreiben, um es im Lesepfad abzuspielen, das Video ist mehr als nur die große Karte).
 Vermieter| Veröffentlicht am 17.04.2018 20:52:16 |
xxhh Veröffentlicht am 17.04.2018 17:42
Vermieter oder ich, ich möchte fragen, ich lege das Video in die eingebettete Ressource ein, und das wird als Byte-Array angezeigt, gibt es eine Möglichkeit, es direkt in den Player zu legen und abzuspielen ( ...

Es wird nicht empfohlen, ein großes Video in eine Ressourcendatei umzuwandeln; man kann prüfen, ob es eine andere Möglichkeit gibt, wie der Player direkt ein Byte übergeben kann[]
Veröffentlicht am 18.04.2018 08:08:48 |
Xiao Zhazha Veröffentlicht am 17.04.2018, 20:52
Es wird nicht empfohlen, ein großes Video in eine Ressourcendatei umzuwandeln; man kann prüfen, ob es eine andere Möglichkeit gibt, wie der Player direkt Byte[] ...

Keiner von ihnen liest Videoansprachen und möchte dich fragen, welche guten Ideen du hast
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com