我一直在掙扎如何傳遞一個結構,包含字節數組到C++ dll的第二天。也就是說,我不知道如何編組C#結構。這裏是我的代碼:包含字節數組的編組結構
在C#程序in C++ dll:
struct Image
{
int Width;
int Height;
int Depth;
uchar *Data;
};
.....
__declspec(dllexport) void DirectTransform(Image *InImage, Image*DestImage)
{
...Implementation...
}
:
[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的電話,並說:
無法編組場 '數據' type'ImageData的」 :託管/非託管無效 類型組合(數組字段必須與ByValArray或 SafeArray配對)。
當我改變LPArray到ByValArray和指向數組的大小(在這種情況下,202500)也不起作用,因爲尺寸太大。當使用SafeArray時,DLL中的程序將失敗並顯示以下消息:
試圖讀取或寫入受保護的內存。這通常是指示其他內存已損壞的 。 結構中的數據是錯誤的。
任何人都可以幫助我嗎?
它必須是IntPtr,用Marshal.AllocHGlobal()初始化它。然而,* Dest *參數是一個問題,你要麼不知道要分配多大的數組,要麼C代碼分配它,然後發生內存泄漏。 – 2014-10-03 08:37:09