我使用非託管庫,它生成灰度圖像(大約100x200像素,或多或少)。圖像包含一個結構,它看起來像在C中:使用C#從IntPtr複製字節數組與Marshal.Copy不起作用
typedef struct abs_image {
ABS_DWORD Width;
ABS_DWORD Height;
ABS_DWORD ColorCount;
ABS_DWORD HorizontalDPI;
ABS_DWORD VerticalDPI;
ABS_BYTE ImageData[ABS_VARLEN];
} ABS_IMAGE
typedef unsigned int ABS_DWORD;
typedef unsigned char ABS_BYTE;
在這裏,我的C#包裝結構:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct ABS_IMAGE {
public uint Width;
public uint Height;
public uint ColorCount;
public uint HorizontalDPI;
public uint VerticalDPI;
public IntPtr ImageData;
}
拼搶的形象和marshallign的ABS_IMAGE
結構工程正好。在以前的版本中,我試圖使用一個固定長度的字節數組ImageData,它有時會崩潰。我認爲這發生了,因爲圖像大小沒有解決。 現在我嘗試在稍後時間讀取圖像字節數組,之前可以計算真實數組長度。這裏的相關代碼:
ABS_Type_Defs.ABS_IMAGE img =
(ABS_Type_Defs.ABS_IMAGE)Marshal.PtrToStructure(
pImage,
typeof(ABS_Type_Defs.ABS_IMAGE));
int length = ((int)img.Height - 1) * ((int)img.Width - 1);
byte[] data = new byte[length];
Marshal.Copy(img.ImageData, data, 0, length);
現在我的問題:我每次要執行Marshal.Copy讀取圖像字節,我得到一個AccessViolationException
。
有沒有人有想法?
就是這樣,非常感謝你:) – mrsubwoof