0

我正在使用一个非托管 C 库,该库具有一个从 C 库中的内部线程调用的回调函数。回调有一个 void * 'context' 参数。

我想将此上下文设置为 C# 类实例的地址,以便我可以从回调中访问成员字段和属性。

我的理解是我需要固定类的内存以确保 GC 不会移动它,因为 C 代码将获取实例地址的副本。但是,GCHandle.Alloc() 声明:“不能固定具有非原始(非 blittable)成员的实例。”

并且确定有足够多的代码尝试固定包含类类型字段的类或结构在运行时会失败。

如何将 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.

4

0 回答 0