我想用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。
答案 0 :(得分:0)
虽然我希望有更好的方法,但以下解决方法可行:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate int StreamRead(IntPtr ptr, byte* buffer, int* bytes);
如果您知道如何使用byte [],请分享。