構造体フィールドに2次元配列的な物は可能でしょうか?


ペコちゃん  2004-04-08 20:06:56  No: 82949  IP: [192.*.*.*]

初めてご質問させて頂きます。皆さん宜しくお願い致します。
VB.net初心者ためご教授して下さい。

VCで作成されたプログラムとCreateFileMappingで作成された共有メモリでデータのやり取りを行いたいのですが、下記の構造体自体が共有メモリとなります。

<VC側構造体宣言>
typedef struct{
    int Field1;
    short Field2[3][300]
}MyStruct;

私の考えたコーディングですが、

<StructLayout(LayoutKind.Sequential)> _
Public Structure SHORT_300
    <VBFixedArray(299), MarshalAs(UnmanagedType.ByValArray, SizeConst:=300)> _
    Dim data() As Short
    Public Sub Init()
        ReDim data(299)
    End Sub
End Structure

<StructLayout(LayoutKind.Sequential)> _
Public Structure MyStruct
    Dim Field1 As Integer
    <VBFixedArray(2), MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> _
    Dim Field2() As SHORT_300
    Public Sub Field2_Init()
        ReDim Field2(2)
    End Sub
End Structure

と標準モジュール内で宣言して、Form_Load内で以下の初期化を行った後にMarshal.SizeOf(MyStruct)でMyStructのサイズを取得したいのですが以下のエラーが発生してしまいます。

<初期化>
(ウォッチウィンドウで確認すると領域は確保されているみたいに思えるが正しいのかは定かです。)
MyStruct.Field2_Init()
MyStruct.Field2(0).Init()
MyStruct.Field2(1).Init()
MyStruct.Field2(2).Init()


<エラー>
型 MyStruct はアンマネージ構造体として集成できません。有効なサイズ、またはオフセットの計算ができません。


<StructLayout(LayoutKind.Sequential)> _
Public Structure MyStruct
    Dim Field1 As Integer
    Dim Field2_1 As SHORT_300
    Dim Field2_2 As SHORT_300
    Dim Field2_3 As SHORT_300
End Structure

<Form_Load内で初期化>
MyStruct.Field2_1.Init()
MyStruct.Field2_2.Init()
MyStruct.Field2_3.Init()

と定義すると正常なサイズが取得されるのですが、実際に1番目の素数が500とかなった場合は500個のフィールドを作成しなければならないので何か良い方法は有るのでしょうか?。

過去ログで同じようなご質問が有り、配列中の構造体一つ一つをマーシャリングすれば大丈夫と有りましてMSのサンプルを見ながら試してみたのですがいまいち分からず実現出来ていません。

出来ましたらご教授をお願い致します。

編集 削除