非托管数组编组和大小作为指针

时间:2012-12-19 11:34:20

标签: c# .net interop unmanaged

我想用C#代码调用一个非托管的C函数,调用本身工作正常,但是我需要回调一下C#代码。我在C ++中有一个带有以下签名的函数:

SRes Read(void *p, void *buf, size_t *size);

我写了一个相应的委托,看起来像这样:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate int StreamRead(IntPtr ptr, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] buffer, ref int bytes);

不幸的是,在尝试执行回调时,应用程序崩溃了(System.AccessViolationException)。这些参数看起来很合理,唯一可能出现的问题就是错误地读取了数组的大小。使用上面的编组规范,数组的大小是从size还是*size读取的?如果前者那么如何将它改为后者呢?如果这不是崩溃的原因那么还有什么可能是问题呢?还值得注意的是,在删除MarshalAs属性后,调用成功,但我的数组大小为1。

1 个答案:

答案 0 :(得分:0)

虽然我希望有更好的方法,但以下解决方法可行:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate int StreamRead(IntPtr ptr, byte* buffer, int* bytes);

如果您知道如何使用byte [],请分享。