Вызов управляемого делегата из неуправляемого кода с использованием взаимодействия COM - PullRequest
0 голосов
/ 01 февраля 2011

Я работаю над хобби-проектом, где мне нужно вызвать управляемого делегата из неуправляемого C ++.Из-за внешних ограничений мне также необходимо передать делегат из управляемого кода в неуправляемый код во время выполнения.

В идеале, я бы хотел просто вызвать делегат, как я бы сделал это в C # (вызывая делегатиспользуя тот же синтаксис, что и при вызове метода), но из неуправляемого кода.Я не могу понять, как это сделать, или даже если это возможно.

Возможно ли это сделать, и если да, то как?Должен ли я использовать события и вызывать события из неуправляемого кода?

Это то, что я хотел бы сделать.

На управляемой стороне (это управляемый C ++)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public delegate void CallbackMethod();

[ComVisibleAttribute (true)]
[InterfaceTypeAttribute(ComInterfaceType::InterfaceIsIUnknown)]
[GuidAttribute("CD305837-98FC-4433-A195-BD50C6C16369")]
public interface class ICallback
{
    void QueueCallback(CallbackMethod^ callBack);
};

И из неуправляемого класса, который реализует интерфейс ICallback:

HRESULT CIoComplectionPort::QueueCallback(_CallbackMethod * callBack)
{
    // How is the callBack method invoked here?
}

Ответы [ 2 ]

4 голосов
/ 01 февраля 2011

Просто экспортируйте функцию, которая принимает указатель на функцию. Код C # может вызывать его, передавая объект делегата. Маршаллер pinvoke выполняет тяжелую работу, то же самое, что Marshal.GetFunctionPointerForDelegate (). Который создает заглушку, которая хранит цель и метод делегата. Указатель на функцию, которую вы получите, указывает на эту заглушку.

Точно так же происходит, когда код C # вызывает, скажем, EnumWindows ().

0 голосов
/ 01 февраля 2011

Вы можете сделать это с помощью C ++ \ CLI, с C ++ \ CLI вы можете разработать мост для связи двух миров, из вашего родного C ++ вызывать метод C ++ \ CLI, который вызывает делегат.

...