从 C++ 调用自引用结构
PInvoke of self referential struct from C++
以下是 C++ 中的自引用结构
typedef struct _FCV
{
unsigned long ulID;
unsigned long ulVersion;
unsigned long ulStatus;
unsigned long ulSize;
struct _FCV* pNext;
} FCV;
我需要使用 PInvoke 转换为 C# 结构,
我应该申报的 "pNext" 是什么?
谢谢。
您可能已经到了 p/invoke 不是完成这项工作的最佳工具的地步。这里的复杂性可能使 C++/CLI 层成为更有吸引力的选择。
对于 p/invoke,您需要将 pNext
字段声明为 IntPtr
。然后,您需要为链表中的每一项填充一个结构实例。最后,您需要遍历分配给 pNext
的列表。这将要求您使用 GCHandle.Alloc
固定每个结构,然后使用 AddrOfPinnedObject
获取固定地址。调用完成后,您需要销毁所有 GCHandle
对象以取消固定结构。
所以这是可以做到的,但代码可能相当笨拙,而且效率可能不是特别高。您应该认真考虑 C++/CLI。
以下是 C++ 中的自引用结构
typedef struct _FCV
{
unsigned long ulID;
unsigned long ulVersion;
unsigned long ulStatus;
unsigned long ulSize;
struct _FCV* pNext;
} FCV;
我需要使用 PInvoke 转换为 C# 结构, 我应该申报的 "pNext" 是什么? 谢谢。
您可能已经到了 p/invoke 不是完成这项工作的最佳工具的地步。这里的复杂性可能使 C++/CLI 层成为更有吸引力的选择。
对于 p/invoke,您需要将 pNext
字段声明为 IntPtr
。然后,您需要为链表中的每一项填充一个结构实例。最后,您需要遍历分配给 pNext
的列表。这将要求您使用 GCHandle.Alloc
固定每个结构,然后使用 AddrOfPinnedObject
获取固定地址。调用完成后,您需要销毁所有 GCHandle
对象以取消固定结构。
所以这是可以做到的,但代码可能相当笨拙,而且效率可能不是特别高。您应该认真考虑 C++/CLI。