Я действительно смущен множеством дезинформации о собственном компоненте / управлял 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#, успешно называют его?
Спасибо!
Вы, вероятно, захотите использовать Marshal.GetDelegateForFunctionPointer
:
MarshalAs
по мере необходимости Marshal.GetDelegateForFunctionPointer
, чтобы превратить указатель в вызываемый C # делегат. У Цзюньфэна Чжана есть пример этого здесь .
Обратите внимание на ограничения, упомянутые в MSDN:
GetDelegateForFunctionPointer имеет следующие ограничения:
- Универсальные шаблоны не поддерживаются во взаимодействии. сценарии.
- Вы не можете передать недопустимую функцию. указатель на этот метод.
- Вы можете использовать этот метод только для чистых указатели на неуправляемые функции.
- Вы не можете использовать этот метод с указатели на функции, полученные через C ++ или из метода GetFunctionPointer.
- Вы не можете использовать этот метод для создания делегировать из указателя функции на другой управляемый делегат.
Часть о C ++, вероятно, относится к указателям на функции для методов класса. Это все еще должно работать для глобальных функций.
Стандартный подход COM заключается в подписке на событие, генерируемое COM-сервером. Использование может использовать ключевое слово event в C #, взаимодействие со средой CLR автоматически реализует необходимый клей COM. Используйте интерфейс IConnectionPoint в своем коде C ++. Справочная информация здесь .