Вызов собственного обратного вызова из управляемого кода.NET (при загрузке управляемого кода с помощью COM)

Я действительно смущен множеством дезинформации о собственном компоненте / управлял interop.

У меня есть регулярный C++ exe, который НЕ создается с помощью материала CLR (это ни Управляемый С++, ни C++ / CLI и никогда не будет). Этот C++ exe является главным, нет никакой управляемой оболочки для него.

Я хотел бы получить доступ к некоторому коду, который я имею в блоке C# от моего C++ exe. Я могу получить доступ к блоку C# из своего кода C++ с помощью COM. Однако, когда мой код C# обнаруживает событие, я хотел бы, чтобы он перезвонил в мой код C++. Указатель функции C++ для призывания обратно в будет обеспечен во времени выполнения. Обратите внимание, что указатель функции C++ к функции, найденной в среде выполнения exe. Это может использовать статических участников оттуда. Я не хочу, чтобы управляемый код попытался загрузить некоторый DLL для вызывания функции (нет никакого DLL).

Как я передаю этот указатель функции C++ своему коду C# через COM/.NET и имею мой код C#, успешно называют его?

Спасибо!

7
задан evilfred 27 May 2010 в 22:31
поделиться

2 ответа

Вы, вероятно, захотите использовать Marshal.GetDelegateForFunctionPointer :

  1. Создайте тип делегата, который соответствует сигнатуре собственной функции, помня о правильном способе маршалинг типов и использование MarshalAs по мере необходимости
  2. Передайте указатель на встроенную функцию из собственного кода в код C #, как бы вы это ни делали (в вашем случае похоже, что вы можете использовать соединение COM -> C #)
  3. Используйте Marshal.GetDelegateForFunctionPointer , чтобы превратить указатель в вызываемый C # делегат.
  4. Вызов делегата с вашими параметрами

У Цзюньфэна Чжана есть пример этого здесь .

Обратите внимание на ограничения, упомянутые в MSDN:

GetDelegateForFunctionPointer имеет следующие ограничения:

  • Универсальные шаблоны не поддерживаются во взаимодействии. сценарии.
  • Вы не можете передать недопустимую функцию. указатель на этот метод.
  • Вы можете использовать этот метод только для чистых указатели на неуправляемые функции.
  • Вы не можете использовать этот метод с указатели на функции, полученные через C ++ или из метода GetFunctionPointer.
  • Вы не можете использовать этот метод для создания делегировать из указателя функции на другой управляемый делегат.

Часть о C ++, вероятно, относится к указателям на функции для методов класса. Это все еще должно работать для глобальных функций.

7
ответ дан 6 December 2019 в 23:01
поделиться

Стандартный подход COM заключается в подписке на событие, генерируемое COM-сервером. Использование может использовать ключевое слово event в C #, взаимодействие со средой CLR автоматически реализует необходимый клей COM. Используйте интерфейс IConnectionPoint в своем коде C ++. Справочная информация здесь .

4
ответ дан 6 December 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: