Внедрение хоста CLR в работающий процесс - возможно?

Этот путь лежит безумие, я знаю.

У меня есть исполняемый файл (исходный код, к которому у меня нет доступа), который я хотел бы расширить через.NET. Это собственный исполняемый файл, поэтому для этого мне нужно внедрить хост CLR. Моя основная идея заключается в предоставлении функциональности, подобной сценариям, через язык.NET (например, C#) и предоставление хуков в целевом исполняемом файле для манипулирования сценариями, и наоборот.

Я знаю, что для этого мне понадобятся различные методы - внедрение DLL, некоторое внедрение ASM во время выполнения и т. Д., Но я хотел бы знать следующее: возможно ли то, о чем я говорю? Еще лучше - кто-нибудь делал что-то подобное раньше?

2 ответа

Решение

Вы можете сделать это с помощью COM-взаимодействия, если ваш собственный исполняемый файл способен использовать COM-объекты. Если вы зарегистрируете свою сборку.NET для взаимодействия, то ваш собственный исполняемый файл может использовать ваши классы.NET точно так же, как "обычные" COM-объекты, и при создании первого он будет ускорять CLR внутри собственного процесса. Аналогично, если вы можете предоставлять COM-объекты из собственного исполняемого файла, вы можете использовать их из своего кода.NET, если создаете сборку взаимодействия (или даже без библиотеки типов, если вы используете только IDispatch).

Основы просты, но я просто выцарапываю поверхность - для такого серьезного проекта, как этот, вам нужна серьезная ссылка. Я очень рекомендую .NET и COM, Полное руководство по взаимодействию от Адама Натана. Это большая книга, которая не оставляет много недосказанного, и в ней также есть много полезной информации о том, как правильно создавать классы.NET и COM. В нем также объясняется, как разместить CLR непосредственно в собственном приложении, но этот вариант может оказаться непрактичным без доступа к исходному коду. Я бы определенно начал с COM-маршрута взаимодействия и только размещал CLR изначально, если у вас нет другого выбора.

На самом деле мы делаем нечто очень похожее для инфраструктуры автоматизации. Возможно, вы захотите взглянуть на проект EasyHook на CodePlex. Он имеет массу приятных функций, включая встроенный коммуникатор IPC для межпроцессного взаимодействия. Это потребовало немного работы, но нужно делать именно то, что вы ищете.

Другие вопросы по тегам