2009-07-28 18 views
1

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

2

Sie möchten wahrscheinlich mit Ressourcen API - UpdateResource und Freunde arbeiten.

+0

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

+0

@TcKs: guter Punkt. Ich weiß es wirklich nicht. – EFraim

2

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.

1

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.

0

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.

1

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.

+0

Wie kann ich den Compiler verwenden, um die DLL zu erstellen. Könnten Sie die erste Option näher erläutern? Danke. – Jake

Verwandte Themen