2009-04-24 13 views
3

Dieser Weg liegt Wahnsinn, ich weiß.Ein CLR-Host in einen laufenden Prozess einfügen - möglich?

Ich habe eine ausführbare Datei (der Quellcode, auf den ich keinen Zugriff habe), den ich über .NET erweitern möchte. Es ist eine native ausführbare Datei, also müsste ich einen CLR-Host injizieren, um dies zu tun. Meine Grundidee ist, scripting-ähnliche Funktionalität über eine .NET-Sprache (zum Beispiel C#) bereitzustellen und Hooks in der Ziel-Executable für die zu manipulierenden Skripte bereitzustellen und umgekehrt.

Ich weiß, ich muss verschiedene Techniken verwenden, um dies zu erreichen - DLL-Injektion, einige Laufzeit-ASM-Injektion, etc., aber was ich gerne wissen würde ist: Ist das, worüber ich rede, möglich? Besser noch - hat jemand so etwas schon mal gemacht?

+0

Ich habe das noch nie gemacht, aber ich denke du bist auf dem richtigen Weg. Injizieren Sie eine DLL, die die CLR-Hosting-APIs verwendet, um die Arbeit zu starten. Ihre native DLL muss damit umgehen, alle Hooks dorthin einzubringen, wo Sie sie benötigen, aber es sollte keinen Grund geben, warum sie Ihre gehostete CLR-Bibliothek nicht für die eigentliche Arbeit aufrufen kann. –

Antwort

2

Sie können dies über COM-Interop ausführen, wenn Ihre native ausführbare Datei COM-Objekte verwenden kann. Wenn Sie Ihre .NET-Assembly für Interop registrieren, kann Ihre native ausführbare Datei Ihre .NET-Klassen genauso wie "gewöhnliche" COM-Objekte verwenden, und wenn die erste erstellt wird, wird die CLR innerhalb des nativen Prozesses hochgefahren. Wenn Sie COM-Objekte über die native ausführbare Datei bereitstellen können, können Sie sie auch aus Ihrem .NET-Code verwenden, wenn Sie eine Interop-Assembly erstellen (oder sogar ohne eine Typbibliothek, wenn Sie nur IDispatch verwenden).

Die Grundlagen sind einfach, aber ich kratze nur an der Oberfläche - für ein ernstes Projekt wie dieses brauchen Sie eine ernsthafte Referenz. Ich empfehle .NET and COM, The Complete Interoperability Guide von Adam Nathan. Es ist ein großes Buch, das nicht viel ungesagt lässt, und es hat auch viele großartige Informationen über das Entwerfen von .NET- und COM-Klassen, um sauber zu interoperieren. Außerdem wird erläutert, wie die CLR direkt in einer nativen App gehostet wird. Diese Option ist jedoch möglicherweise ohne Zugriff auf den Quellcode nicht praktikabel. Ich würde definitiv mit der COM-Interoproute beginnen und die CLR nur nativ hosten, wenn Sie keine andere Möglichkeit haben.

+0

Danke - obwohl leider die Ziel-ausführbare Datei, die ich im Sinn habe, * nicht * COM-fähig ist. = \ Noch werde ich in die Referenz suchen, die Sie zur Verfügung gestellt haben - danke nochmals. =) –

1

Wir machen tatsächlich etwas sehr ähnliches für einen Automatisierungsrahmen. Vielleicht möchten Sie sich das EasyHook Projekt auf CodePlex anschauen. Es hat eine Menge nette Eigenschaften einschließlich eines eingebauten IPC Communicators für die prozessübergreifende Kommunikation. Es erfordert ein bisschen Beinarbeit, sollte aber genau das tun, wonach Sie suchen.