Es gibt eine DLL, die gemacht wird, wenn ich eines meiner Programme kompiliere. Die DLL enthält Bilder, die von der Software angezeigt werden. Ich habe eine andere Software, einen Konfigurator, erstellt. Ich will, dass es in der Lage ist, die DLL zu öffnen, das Banner zu ersetzen, und nur das Banner, Bild mit dem Bild, das der Benutzer wählt, und dann in eine DLL neu zu kompilieren. Wie kann ich das machen?Öffnen Sie eine DLL und schreiben Sie
Antwort
Sie möchten wahrscheinlich mit Ressourcen API - UpdateResource und Freunde arbeiten.
Dafür gibt es von Microsoft genehmigte Strategien, insbesondere die Ressourcenabschnitte eines PE-Abbilds.
Allerdings würde ich empfehlen, ein großes Array in C zu haben, das mit einer bestimmten magischen Sequenz beginnt und sich über eine bekannte Größe erstreckt. Suchen Sie dann beim Ersetzen des Arrays nach der magischen Sequenz und ersetzen Sie einfach die Bytes in der DLL.
Betrachten Sie Mono - Cecil. Cecil ist Tool (API), mit dem Sie IL-Code von Baugruppen ändern/neu schreiben können. Es sollte auch die Ressourcen neu schreiben.
Seien Sie sich bewusst, dass jede Vorgehensweise, die Sie damit machen, Nebenwirkungen hat - insbesondere wird es Code-Signaturen auf der Baugruppe brechen.
Möglicherweise möchten Sie eine separate Ressourcendatei, die Ihre Assembly lädt. Dies macht es trivial zu aktualisieren. Sie können sogar eine einfache Datenbank verwenden, wenn Sie mehrere Ressourcen haben.
Sie sollten wahrscheinlich in Betracht ziehen, die DLL im laufenden Betrieb mithilfe des in .NET verfügbaren integrierten C# - oder VB.NET-Compilers zu kompilieren. Die genauen Klassen, die die Compiler implementieren, sind Microsoft.CSharp.CSharpCodeProvider und Microsoft.VisualBasic.VBCodeProvider. Beide sind in der System.dll-Assembly definiert.
Alternativ können Sie auch die mit .NET Framework installierten Anwendungen csc.exe, vbc.exe und resgen.exe verwenden, um die DLL zu erstellen.
Dies könnte durch Erstellen eines Prozesses mit der System.Diagnostics.Process-Klasse erfolgen. Damit können Sie die Console.In- und Console.Out-Streams erfassen, um Konsolen-I/O zu einem StreamReader/StreamWriter umzuleiten, um eine enge Integration mit der Configurator-Funktion zu ermöglichen.
Nachdem ich das gesagt habe, denke ich, die bessere Option ist die erste, wo Sie die tatsächlichen Compiler-Klassen verwenden, anstatt die ausführbaren Dateien aufzurufen (die intern auch nur die Compiler-Klassen aufrufen).
Wenn alles andere fehlschlägt, gibt es ein Compiler-Konstruktor-Projekt für CodePlex, das möglicherweise von Nutzen ist. Es hat Dinge wie PEAssemblyReader und PEAssemblyWriter-Klassen (nicht über die genauen Namen nicht allzu sicher), aber die Klassen erlauben es, PE-Dateien zu lesen und zu schreiben. PE steht für Portable Executable und ist das von Windows für ausführbare Dateien verwendete Format. Bei dieser Option müssen Sie jedoch genau wissen, wie Sie die PE-Struktur im Speicher ändern und die geänderte PE-Struktur ausschreiben.
Ich denke immer noch, die erste Option ist die zu verwenden, es sei denn, Sie haben nicht die Quellen für diese DLLs zur Laufzeit verfügbar.
Wie kann ich den Compiler verwenden, um die DLL zu erstellen. Könnten Sie die erste Option näher erläutern? Danke. – Jake
- 1. Java-Datei - Öffnen Sie eine Datei und schreiben Sie daran
- 2. Öffnen Sie eine neue Registerkarte/Fenster und schreiben Sie etwas?
- 3. C++ & Python schließen und öffnen Sie Dateien in verschiedenen DLL
- 4. VB6 - Öffnen Sie Datei für gemeinsames Schreiben
- 5. Wie kann ich eine Datei zum Lesen und Schreiben öffnen und sie erstellen, wenn sie nicht existiert, ohne sie abzuschneiden?
- 6. Öffnen Sie die Konsole von C# DLL und drucken Sie die Ausgabe
- 7. schreiben und testen Sie eine Methode PrintSquare
- 8. Öffnen, entfernen Sie Text und speichern Sie eine Textdatei
- 9. Lesen Sie SMS und öffnen Sie eine Anwendung Android Studio
- 10. Öffnen Sie eine Excel-Datei und speichern Sie als .XLS
- 11. Öffnen Sie eine Datei und ersetzen Sie Zeichenfolgen in C#
- 12. Öffnen Sie ein C# -Formular (.dll) mit VBA (Access 2010)
- 13. Öffnen Sie Windows-Zertifikatsliste von C# dll mit Delphi 10
- 14. So öffnen Sie eine Audiodaten
- 15. Schreiben Sie eine Textdatei und Kraft zum Download mit php
- 16. Öffnen Sie eine binäre Datei
- 17. Verwenden Sie eine reguläre DLL mit freigegebenen MFC-DLL
- 18. So laden Sie eine referenzierte DLL ohne die physikalische DLL
- 19. Schreiben Sie eine Datei mit PHP
- 20. Können Sie eine C# DLL von einer C DLL aufrufen?
- 21. Öffnen Sie eine Datei und schreiben Inhalt auf ein DIV, span, Etikett, irgendeine Art von Container
- 22. Programmgesteuert erzeugen Sie eine C Win32 DLL
- 23. Erstellen Sie eine JNI-DLL mit MINGW
- 24. Erstellen Sie eine DLL von HEX-Code
- 25. Öffnen Sie Word-Dokumente mit Interop DLL, ohne Word zu öffnen?
- 26. Kann ich IO-Anweisungen in eine DLL schreiben?
- 27. Excel 2013 Öffnen Sie eine Datei und fragen Sie den Benutzer mit "Autor möchte, dass Sie als schreibgeschützt öffnen"
- 28. Geben Sie eine URL in den Eingabetext ein und öffnen Sie sie auf der aktuellen Seite
- 29. Öffnen Sie eine Videodatei und spielen Sie sie ab einer bestimmten Zeit mit Stapel
- 30. Öffnen Sie eine URL mit window.open und übergeben Sie Daten an sie?
Sind Sie sicher, dass UpdateResource Ressourcen in .NET-Assemblys ändern kann? Das Format der Ressourcen in nativer DLL und in verwalteten Ressourcen ist nicht identisch. – TcKs
@TcKs: guter Punkt. Ich weiß es wirklich nicht. – EFraim