我想从 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
or中读取*size
?如果是前者,那么如何将其更改为后者?如果这不是崩溃的原因,那么这里还有什么问题?还值得注意的是,删除MarshalAs
属性后调用成功,但我的数组大小为 1。