我第二天一直在努力学习如何传递一个结构,包含byte到c ++ dll的数组。也就是说,我不知道如何编组C#结构。这是我的代码:
in C++ dll:
struct Image
{
int Width;
int Height;
int Depth;
uchar *Data;
};
.....
__declspec(dllexport) void DirectTransform(Image *InImage, Image*DestImage)
{
...Implementation...
}
在C#程序中:
[StructLayout(LayoutKind.Sequential)]
struct ImageData
{
public int Width;
public int Height;
public int Depth;
[MarshalAs(UnmanagedType.LPArray)]
public byte[] Data;
}
[DllImport("MyDll.dll",CallingConvention=CallingConvention.Cdecl)]
public static extern void DirectTransform(ImageData Src, ImageData Dest);
//Fill out both structures..
DirectTransform(Image, DestImage);
在调用DirectTransform时抛出异常,并说:
无法整理字段'数据'类型' ImageData':无效的托管/非托管 类型组合(数组字段必须与ByValArray或 的SafeArray)。
当我将LPArray更改为ByValArray并指向数组的大小(在本例中为202500)时,它也不起作用,因为它的大小太大。使用SafeArray时,程序在DLL中失败并显示消息:
尝试读取或写入受保护的内存。这通常是一个 指示其他内存已损坏。 结构中的数据是错误的。
有人可以帮助我吗?
答案 0 :(得分:0)
看看这个question
您可以尝试将指针传递给数组,例如整数长度字段。
这样做,您需要使用Marshal.AllocHGlobal
手动分配非托管内存,调用您的函数,然后在finally
块中调用 - 使用Marshal.FreeHGlobal
后自行清除
使用Marshal.Copy
方法将数据复制到已分配的内存中。