如何编组指向int的指针?

时间:2013-07-12 16:12:49

标签: c# c++ marshalling

非托管C ++:

int  foo(int **    New_Message_Pointer);

如何将其编组到C#?

[DllImport("example.dll")]
static extern int foo( ???);

2 个答案:

答案 0 :(得分:5)

您可以声明如下函数:

[DllImport("example.dll")]
static extern int foo(IntPtr New_Message_Pointer)

要调用此函数并将指针传递给int数组,例如,您可以使用以下代码:

Int32[] intArray = new Int32[5] { 0, 1, 2, 3, 4, 5 };

// Allocate unmamaged memory
IntPtr pUnmanagedBuffer = (IntPtr)Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(Int32)) * intArray.Length);

// Copy data to unmanaged buffer
Marshal.Copy(intArray, 0, pUnmanagedBuffer, intArray.Length);

// Pin object to create fixed address
GCHandle handle = GCHandle.Alloc(pUnmanagedBuffer, GCHandleType.Pinned);
IntPtr ppUnmanagedBuffer = (IntPtr)handle.AddrOfPinnedObject();

然后将ppUnmanagedBuffer传递给你的函数:

foo(ppUnmanagedBuffer);

答案 1 :(得分:1)

你会希望它是

static extern int foo(IntPtr New_Message_Pointer)

一旦你有了IntPtr,那么困难的部分可能就是用它做什么......

您可能需要查看this question from SO,它处理指向指针到结构的指针。它有所不同,但可能会让你朝着正确的方向前进。