2009-08-06 73 views
7

您有需要一個字節數組編組未知的數組大小

byte[] 

然而,該數組的大小取決於您要提交(寬x高)的圖像

因此在結構上的...如何你做

[MarshalAs(UnmanagedType.ByValArray, SizeConst = ???)] 
public Byte[] ImageData; 

sizeconst工作時必須有字節數組從C#傳遞到C dlls?

+0

自定義編組器似乎是唯一的選擇。 – IllidanS4 2017-02-10 12:50:20

回答

2

您需要更改編組類型。如果您編組爲ByValArray,而不是其他類型,則需要SizeConst。有關詳細信息,請參閱UnmanagedType enum

我懷疑的是,要馬歇爾爲C指針數組:

[MarshalAs(UnmanagedType.LPArray)] 

這將導致其馬歇爾通過一個標準的C數組(BYTE *),所以只有一個指針傳遞通過。這樣做可以讓你傳遞任何大小的數組。通常,您還需要將數組大小作爲另一個參數(或提供相同信息的圖像寬度/高度/ bpp)傳遞,因爲在C/C++中無法輕鬆進行分辨。

+0

感謝您的回覆裏德。然而,我這樣做,現在得到這個錯誤 託管/非託管類型組合無效(數組字段必須與ByValArray或SafeArray配對) 當建立IntPtr,然後Marshal.StructureToPtr ...思考? – Olewolfe 2009-08-06 18:02:24

+0

查看枚舉。將需要更多的信息。我假設你是從託管 - >非託管編組,但是如果你以相反的方式進行編組,可以將它作爲IntPtr(而不是字節[])進行Marhsal,或者將其設置爲使用SafeArray。 – 2009-08-06 18:04:24

+1

不幸的是,使用除[MarshalAs(UnmanagedType.ArrayByVal,sizeConst = xxxx)]之外的任何東西都會導致內存尋址。所以基本上有一個結構(它包含一個字節[])需要轉換爲一個IntPtr,因此它可以傳遞給DLL。並且字節[]中的數據越來越混亂。通過將數據從IntPtr複製到byte []並查看數據來驗證這一點,發現所有內容都被更改,除非我在結構中設置了MarshalAs。 – Olewolfe 2009-08-06 21:28:39