構造体のマーシャリング

はまったのでメモ。

C#からCに渡す構造体を

[StructLayout(LayoutKind.Sequential)]
class Fuga
{
    public int a;
}

こんなふうに書いてうまくいってたからstructじゃなくてclassでいいんだっけ?と思いつつも使ってたけど、

[StructLayout(LayoutKind.Sequential)]
class Hoge
{
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
    public Fuga[] fuga = { new Fuga() };

    public int b;
}

こういうのを書いたらバイト配列にしたときゴミが入った。
Fugaの定義をclassからstructにした場合はちゃんと動くからやっぱ参照型だとだめなのね。