

以下のサンプルソースのようなデータ構造をクラスで構築したいと思っていますが  
マーシャル指定したサイズが期待通りに動作しない状態です。

[code]

        [Serializable, StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class Value
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
            public byte[] memberA;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
            public int[] memberB;
            public Value()
            {
                this.memberA = new byte[2];
                this.memberB = new int[7];
            }
        }
    
        [Serializable, StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class Data
        {
            public int type;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public Value[] values;
            public Data()
            {
                this.values = new Value[10];
            }
        }
    
[/code]

具体的に問題となっている箇所は、Dataクラスの Value
配列でマーシャル指定してるサイズが正しく処理されず、おそらく4byte*10の値になっています。

> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]  
>  public Value[] values;

マイクロソフトのドキュメントによると、ByValArrayは
”要素が構造体にフィールドとして定義されている配列でのみ使用できます。”となっているため使用できなさそうなのは理解しましたが、他のやり方でサイズを正しく処理できる方法がないかと思い質問させていただきました。

なお、構造体でなくクラスでデータ構造を構築したい理由は、引数なしのコンストラクタで、各配列要素のエリア確保を行いたいためです。


CC BY-SA 4.0
2020-01-30T11:52:23.580
62663
2020-01-30T12:39:37.810
2020-01-30T12:39:37.810
13909
13909
question
c# visual-studio
VisualStudio2017 C# クラス配列をMarshalAs指定することは可能ですか？