マネージ配列はポインターとは異なります。マネージド配列には配列のサイズが必要であり、構造体をマーシャリングしようとしている場合は、直接マーシャリングするための固定サイズが必要です。
属性SizeConst
のパラメーターを使用して、データがマーシャリングされるときのデータのサイズを設定できます。MarshalAs
x
しかし、とy
は画像の寸法であり、 のサイズはdata
これらの変数に依存すると推測しています。ここでの最善の解決策は、 としてマーシャリングし、IntPtr
必要なときにデータにアクセスすることです。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class IMAGE
{
public UInt32 x;
public UInt32 y;
private IntPtr data;
public byte[][] Data
{
get
{
byte[][] newData = new byte[y][];
for(int i = 0; i < y; i++)
{
newData[i] = new byte[x];
Marshal.Copy(new IntPtr(data.ToInt64() + (i * x)), newData[i], 0, x);
}
return newData;
}
set
{
for (int i = 0; i < value.Length; i++)
{
Marshal.Copy(value[i], 0, new IntPtr(data.ToInt64() + (i * x)), value[i].Length);
}
}
}
}
アンセーフ コードの使用が許可されている場合は、 を に変更IntPtr
しbyte**
て直接操作できます。
セッターを使用すると、アンマネージ メモリにやみくもに書き込む前に、値の次元を確認したくなるでしょう。