2011-01-31 2 views
0

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

В идеале, я хотел бы просто вызвать делегата, как я был бы на 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? 
} 

ответ

4

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

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

0

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

Смежные вопросы