【发布时间】:2016-06-01 21:03:46
【问题描述】:
我在将 void 指针从非托管代码传递到托管代码时遇到问题。 .cpp 文件中有一个函数的指针
TESTCALLBACK_FUNCTION testCbFunc;
TESTCALLBACK_FUNCTION 采用 C++ 结构
typedef void (*TESTCALLBACK_FUNCTION )(TImage image);
struct TImage
{
int Width; //width
int Height; //height
void *Buf; //data buffer
};
C#函数和结构
public void TImageReceived(TImage image)
{
// logic
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1), Serializable]
public struct TImage
{
public int Width;
public int Height;
public IntPtr Buf;
}
TImageReceived 传递给非托管代码,当它被调用时,我收到异常。
System.Runtime.InteropServices.SafeArrayTypeMismatchException
如果我在非托管代码的字段 Buf 中传递 NULL,一切都会正常工作。
我知道 MarshalAs 属性,但问题是我不能使用 SizeConst,因为 Buf 的大小总是不同的。但它总是有 Width*Height 的大小。
[MarshalAs(UnmanagedType.ByValArray,SizeConst=???)]
如何将 void* 从非托管代码转换为托管代码?
【问题讨论】:
-
如果没有确定大小的机制,您也无法在非托管世界中使用
void*做很多事情。那么您的非托管代码如何确定Buf的大小?是否有基于Width和Height的计算? (例如,也许Buf只是一个表示宽度*高度的字节序列?) -
是的,
Buf的大小为 Width*Height。
标签: c# c++ marshalling void-pointers