Внедрение хоста CLR в работающий процесс - возможно? - PullRequest
3 голосов
/ 25 апреля 2009

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

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

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

Ответы [ 2 ]

2 голосов
/ 25 апреля 2009

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

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

1 голос
/ 09 марта 2011

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

...