c# - 使用 COM 互操作从非托管代码调用托管委托(delegate)

标签 c# c++ com clr unmanaged

我正在从事一个业余项目,我需要从非托管 C++ 调用托管委托(delegate)。由于外部约束,我还需要在运行时将委托(delegate)从托管代码传递到非托管代码。

理想情况下,我想要做的是像在 C# 中那样简单地调用委托(delegate)(通过使用与方法调用相同的语法调用委托(delegate)),但来自非托管代码。我不知道该怎么做,甚至不知道该怎么做。

这可能吗?如果可以,怎么做?我必须使用事件并从非托管代码引发事件吗?

这就是我想要做的。

在托管方面(这是托管 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 接口(interface)的非托管类:

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

最佳答案

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

当 C# 代码调用 EnumWindows() 时,会发生完全相同的事情。

关于c# - 使用 COM 互操作从非托管代码调用托管委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4856736/

相关文章:

c++ - 获取 VARIANT 的值到 int

c# - 将 intResult 变暗为整数 = 无

c++ - 如何动态跟踪 OpenGL 中的纹理单元?

c++ - 终端文本编辑器的用户界面是如何实现的?

c++ - Win8 的拼写检查 API 将 null 作为输出参数发送

c# - 用 C# 编写的 COM 对象 - 获取类,但不获取方法

c# - DataTable 是通过引用传递的吗?

c# - 未捕获重新抛出异常

c# - 在 .NET Core 2.1 中使用 AOP 进行日志记录

c++ - 让我们分析一下 "collect2: ld returned 1 exit status"?