将C ++ / CLI委托^转换为long和back

时间:2010-12-31 17:52:16

标签: delegates c++-cli

如何将PaintDelegate ^转换为一个long作为refCon参数发送,以便一旦进入TrackTransferCB,我可以将其转换回来并调用它?只要我可以将其转换回代表,它转换为的长度不一定意味着什么。

这是一般的想法:

PaintDelegate^ paintDel = ...;
refCon = (long)paintDel;  // This conversion doesn't work

...

static OSErr TrackTransferCB(Track t, long refCon) {
    (PaintDelegate^)refCon->Invoke();  // This conversion doesn't work
}

哪种转换会以这种方式运作?

1 个答案:

答案 0 :(得分:0)

委托对象是垃圾收集对象,就像.NET中的任何其他非值类型一样。这意味着垃圾收集器可以移动它们。这意味着获取其地址不起作用,当GC压缩堆时,地址将会改变。

我猜你需要这样做才能将非托管代码传递给委托。手柄是典型的解决方案。只需在每次创建新对象时增加一个计数器。将其存储在Dictionary<int, PaintDelegate^>^中,并将计数器值传递给非托管代码。

Marshal :: GetFunctionPointerForDelegate()是另一种方法,非托管代码现在可以直接调用委托目标。不长但是空虚*。但是,你仍然需要将委托对象存储在安全的地方,这样就不会收集垃圾。我推荐前者。