1

我想从 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不幸的是,应用程序在尝试执行回调时崩溃 ( )。参数看起来很合理,唯一可能想到的问题是数组的大小读取不正确。使用上面的封送规范,数组的大小将从sizeor中读取*size?如果是前者,那么如何将其更改为后者?如果这不是崩溃的原因,那么这里还有什么问题?还值得注意的是,删除MarshalAs属性后调用成功,但我的数组大小为 1。

4

1 回答 1

0

虽然我希望有更好的东西,但以下解决方法可以正常工作:

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

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

于 2012-12-21T09:59:27.717 回答