我正在使用一个非托管C库,该库具有一个从C库中的内部线程调用的回调函数。回调具有void *'context'参数。
我想将此上下文设置为C#类实例的地址,以便可以从回调中访问成员字段和属性。
我的理解是,我需要固定类的内存以确保GC不会移动它,因为C代码将获取实例地址的副本。 但是,GCHandle.Alloc()指出:“不能固定具有非原始(不可复制)成员的实例。”
并且确保足够的代码尝试固定一个类或包含类类型字段的结构在运行时失败。
如何将C#类实例的地址传递给我的C ++代码,并确保该地址保持有效(即,GC不移动该地址)?
编辑#1 更正:该库是C库,而不是前面所述的C ++(在上面的文本中已更正)。并不是说它应该有所作为。
这是C回调的原型:
void Callback(uint32_t hCamera, uint32_t dwInterruptMask, void *pvParams);
并用C#包装:
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public unsafe delegate void PHX_AcquireCallBack(uint hCamera, uint dwInterruptMask,
IntPtr pvParams);
安装回调后, pvParams
会传递到C库中。该库存储指针,但不尝试以任何方式访问它。只要调用回调,它就会将其传递回去。
使用C ++代码中的库时,我通常为this
传递一个pvParams
指针。