C#:如何访问嵌套在struct中的非托管,2-Dbinary数组?

时间:2011-06-30 23:37:17

标签: c# delphi interop

问题: 我正在尝试访问在Borland Delphi中创建并存储在SQL Server数据库中的二进制记录(作为BLOB)。

问:在C#????

中访问二维数组的语法是什么?

这是一个例子:

const
  MAX_BOWLERS = 8;
  gMAX_FRAMES = 40;
  ...

type

TFrame = Record Balls : array[1..3] of ShortInt; // Pins standing: balls 1, 2 and 3 Pins : array[1..3] of ShortInt; CurrentBall : Byte; Score : Integer; // Current score (-1= undefined) Attributes : TFrameAttributes; ...

TFrames = Array[1..Max_Bowlers, 0..gMax_Frames] of TFrame;

TgameRec = Record Side : Byte; Bowlers : tBowlers; Frames : TFrames; ...

... Soooooooo

我已成功将有效的“GameRec”传递给C#-land。

我想访问GameRec.Frames [iBowler,iFrame]。

问:如何定义TFrame的C#类型“TFrames = Array [1..Max_Bowlers,0..gMax_Frames]”;这样我才能做到?

非常感谢您提前... PSM

1 个答案:

答案 0 :(得分:3)

我找到了解决方案:

  1. 将二维数组视为自己的结构,包含一个数组。

  2. 包含的数组是1D,由cols * rows elements

  3. 组成
  4. 提供一个C#“索引属性”,以便外部客户端可以访问元素,就好像它们是二维数组一样(就内存布局而言,它们实际上是!)

  5.     // C# Definition for Delphi 2-D array
        [StructLayout(LayoutKind.Sequential, Pack = 4)]
        public unsafe struct TFrames
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst=(MAX_BOWLERS)*(gMAX_FRAMES+1))]
            private TFrame[] row;
            public TFrame this[int iBowler, int iFrame]
            {
                get
                {
                    int ioffset = (iBowler * (gMAX_FRAMES+1)) + iFrame;
                    return row[ioffset];
                }
            }
        }

       // C# client example
        public static string ConvertSplitToString(TgameRec currentGame, int iBowler)
        {
            StringBuilder sb = new StringBuilder();
            TFrames frames = currentGame.frames;
            for (int iFrame = 0; iFrame < 10; iFrame++)
            {
                if (frames[iBowler, iFrame].fSplit != 0)
                    sb.Append('.');
                else 
                    sb.Append(' ');
            }
            return sb.ToString ();
        }