メンバに配列を持つ構造体のマーシャリング

コメントにご質問があったので、少し長くなりそうなのでこちらで書かせてもらいます。

構造体とポインタ(若しくはバイト配列)との相互変換を行う方法については以前紹介しましたが、あの時の例はあえてごく簡単な構造体にしてありました。今回はメンバとして配列をもっている構造体の場合について考えます。ここでは、以下のような構造体を例にとりご説明します。

[StructLayout(LayoutKind.Sequential)]
struct Hoge
{
    public string Str;
    public double[] Array;
    public Fuga[] Fugafuga;
}

[StructLayout(LayoutKind.Sequential)]
struct Fuga
{
    public int X;
    public int Y;
    public Fuga(int x, int y) { X = x; Y = y; }
}

Hogeは、文字列(つまり、charの配列)と、doubleの配列、そして構造体Fugaの配列を持っています。Fugaはblittableでなければなりません。

続きを読む