#c# #c
#c# #c
Вопрос:
Я пытаюсь отслеживать запущенное приложение, написанное на C , используя другое приложение на C #.
В моем коде на C я определил API:
_declspec(dllexport) //is this even possible when compiling an .exe?
int getSomething();
Есть ли способ вызвать эту функцию из кода C #?
Будет ли работать классический подход:
[DllImport("myexe.exe", CharSet = CharSet.Auto)]
public static extern int getSomething();
Комментарии:
1. Чтобы ответить на первый подвопрос: да, исполняемые файлы могут иметь экспортированные функции.
2. для пояснения, однако, вы будете загружать модуль в свой собственный процесс, не подключаясь к «запущенному приложению», которое вы пытаетесь отслеживать. Для этого вам понадобится какой-то IPC.
3. @Yaur да, IPC — это то, что я искал. После некоторого размышления я понял, что то, что я хотел, невозможно без IPC.
Ответ №1:
Да, любой исполняемый файл PE может экспортировать функции таким образом. Просто имейте в виду, что компилятор иногда искажает имена экспорта, что приводит к таким вещам:
MyAPIFunction@16
Вы можете проверить, что имена в порядке, загрузив исполняемый файл в такой инструмент, как PEInfo.
Вы должны иметь возможность вызывать его точно так же, как и функцию в DLL.
Обновление Ок, так что, похоже, вам нужен IPC, а не вызов P / Invoke. Смотрите эту страницу для получения информации о том, как использовать именованные каналы в C #. И вот отличное место, чтобы начать поиск информации о том, как использовать именованные каналы в C .
Комментарии:
1. Изменит ли вызов, например, функции set соответствующую переменную в процессе C ?
2. Нет. Вы вызываете функцию в контексте вызывающего, а не в контексте другого процесса. Он отображает двоичный образ в виртуальную память процесса .NET и выполняет вызов P / Invoke по адресу указанной функции. Все происходит в процессе .NET, так же, как если бы вы загружали DLL. Я думаю, вы ищете решение для выполнения операций в другом запущенном процессе. Если это так, вам нужен механизм взаимодействия между процессами. Есть несколько способов сделать это, но именованные каналы и сокеты обычно являются лучшими вариантами.
3. да, это именно то, что я пытаюсь сделать. Я хотел избежать взаимодействия между процессами, но, видимо, другого способа нет (что имеет смысл, вот почему я задал вопрос). Тем не менее, спасибо за ответ.
Ответ №2:
Да, вы можете экспортировать функции из a .exe
точно так же, как вы можете из a .dll
, и способ, который вы показали, является правильным способом сделать это.
Нет, вы не можете взаимодействовать с существующим процессом, делая это, так же как загрузка функции из a .dll
не позволит вам взаимодействовать с другими процессами, используя это .dll
.