2009-04-24 5 views
3

De cette façon, il y a la folie, je sais.Injecter un hôte CLR dans un processus en cours - possible?

J'ai un exécutable (le code source auquel je n'ai pas accès) que je voudrais étendre via .NET. C'est un exécutable natif, donc j'aurais besoin d'injecter un hôte CLR pour le faire. Mon idée de base est de fournir une fonctionnalité de type script via un langage .NET (C#, par exemple) et de fournir des hooks dans l'exécutable cible que les scripts manipuleront, et vice versa.

Je sais que j'utiliserai différentes techniques pour y parvenir - injection de DLL, injection ASM d'exécution, etc., mais j'aimerais savoir: est-ce que ce dont je parle est possible? Mieux encore - quelqu'un a-t-il déjà fait quelque chose comme ça?

+0

Je n'ai jamais fait cela, mais je pense que vous êtes sur la bonne voie. Injectez une DLL qui utilise les API d'hébergement CLR pour mettre les choses en marche. Votre DLL native devra gérer l'injection de tous les hooks là où vous en avez besoin, mais il ne devrait pas y avoir de raison pour qu'elle ne puisse pas appeler votre bibliothèque CLR hébergée pour le vrai travail. –

Répondre

2

Vous pouvez le faire en utilisant COM interop, si votre exécutable natif est capable d'utiliser des objets COM. Si vous enregistrez votre assembly .NET pour interop, votre exécutable natif peut utiliser vos classes .NET comme des objets COM "ordinaires", et lorsque le premier est créé, le CLR sera généré dans le processus natif. De même, si vous pouvez exposer des objets COM à partir de l'exécutable natif, vous pouvez les utiliser à partir de votre code .NET si vous créez un assembly interop (ou même sans bibliothèque de type, si vous utilisez uniquement IDispatch). Les bases sont simples mais je ne fais que gratter la surface - pour un projet sérieux comme celui-ci, vous avez besoin d'une référence sérieuse. Je recommande fortement .NET and COM, The Complete Interoperability Guide par Adam Nathan. C'est un gros livre qui ne laisse pas beaucoup de non-dits, et il a aussi beaucoup de bonnes informations sur la conception de classes .NET et COM à interopérer proprement. Il explique également comment héberger le CLR directement dans une application native, mais cette option peut ne pas être pratique sans accès au code source. Je commencerai certainement avec la route d'interopérabilité COM, et n'hébergera le CLR qu'en mode natif si vous n'avez pas d'autre option.

+0

Merci - bien que malheureusement l'exécutable cible que j'ai à l'esprit est * pas * compatible COM. = \ Toujours je vais regarder dans la référence que vous avez fournie - merci encore. =) –

1

En fait, nous faisons quelque chose de très similaire pour un cadre d'automatisation. Vous voudrez peut-être jeter un oeil au projet EasyHook sur CodePlex. Il a une tonne de fonctionnalités intéressantes, y compris un communicateur IPC intégré pour la communication inter-processus. Il a fallu un peu de travail de jambe mais devrait faire exactement ce que vous recherchez.

Questions connexes