在C#中使用PInvoke的不透明指针

时间:2013-11-27 20:51:53

标签: c# pointers pinvoke

我正在使用带有以下不透明句柄的第三方C库:

typedef struct _VendorHandle *VendorHandle;

以下是供应商的C示例,说明如何加载句柄:

VendorHandle handle;
int err;
err = vendorLoadFile(&handle, "something.bin");

我试图使用以下声明在C#中使用PInvoke调用此方法:

[DllImport("VendorLib.dll")]
static extern int vendorLoadFile(IntPtr handle, string path);

然后我添加了以下代码来使用声明:

IntPtr handle = new IntPtr();
int code = vendorLoadFile(handle, path);

当我运行它时,我收到以下错误:

  

尝试读取或写入受保护的内存。这通常是一个   表明其他内存已损坏。

我知道DLL很好并且PInvoke正在工作,因为我正在执行他们的vendorVersion()方法,所以它必须是别的我做错了。

1 个答案:

答案 0 :(得分:7)

该函数将指针带到一个不透明的句柄,以便它可以将句柄写入指针所指向的内存中。
在C#术语中,这是out IntPtr

[DllImport("VendorLib.dll")]
static extern int vendorLoadFile(out IntPtr handle, string path);

IntPtr handle;
int code = vendorLoadFile(out handle, path);