Вызов исполняемых функций C из C#

#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 .