我需要能够在使用以下方法注册回调时传递上下文对象,该方法链接到C ++ DLL文件,因此无法更改方法参数。回调方法执行时,回调将其作为参数之一返回。
public static void RegisterCallback(UInt32 instance, CALLBACK callbackFunction, UInt32 context)
最后一个论点是唯一一个我遇到麻烦的人。我假设它的意思是对象的内存地址(或引用)。
C ++代码将此参数作为void *
有什么想法吗?
答案 0 :(得分:2)
这在C风格的api中很常见,它允许注册回调。例如,它与托管代码中的IAsyncResult.AsyncState扮演完全相同的角色。回调获取值,它可以将其用于任何目的。例如,可以是对象数组中的索引。可以是状态变量。对于C ++,它通常是C ++对象的 this 指针。非常方便,允许调用C ++对象的实例函数。一切顺利。
请注意,您不太可能需要它。首先暗示你不是因为你不知道该用它做什么。这很可能在C#中,因为你已经有了上下文。您用于 callbackFunction 参数的委托已捕获此对象引用。因此,回调方法中所需的任何状态都可以由类的字段提供。就像C ++一样,减去额外的呼叫。
所以不要担心它,传递0.或者真的,修复声明,参数应该是IntPtr,传递IntPtr.Zero。也许你应该为实例参数做些什么,它像“句柄”一样嘎嘎作响。引擎盖下的指针。
请注意 callbackFunction 参数,您需要确保垃圾收集器不会破坏委托对象。它不知道本机代码正在使用它。您必须将其存储在静态变量中,或者调用GCHandle.Alloc()以便始终引用它。