使用COM互操作从非托管代码调用托管代理

时间:2011-01-31 22:11:25

标签: c# c++ com clr unmanaged

我正在开发一个业余爱好项目,我需要从非托管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 个答案:

答案 0 :(得分:4)

只需导出一个接受函数指针的函数。 C#代码可以调用它,传递委托对象。 pinvoke marshaller完成了繁重的工作,与Marshal.GetFunctionPointerForDelegate()相同。这会创建一个存储委托的Target和Method的存根。您将获得的函数指针指向该存根。

当C#代码pinvokes,例如EnumWindows()时,会发生同样的事情。

答案 1 :(得分:0)

您可以使用C ++ \ CLI,使用C ++ \ CLI,您可以开发一个桥接来传达这两个世界,从您的本机C ++调用一个调用委托的C ++ \ CLI方法。