0

メモリ マッピングの目的で、c# で次の c++ 構造体をマッピングする際に問題が発生しています。

typedef struct
{
DWORD Data1;
DWORD Data2;
double AverageData[2];
DWORD NumData[2];
} DIRECTIONAL_STATS;

typedef struct
{
DIRECTIONAL_STATS DirectionStats[2];
char  Name[100];
int   StatLength;
} OTHER_STATS;


typedef struct
{
OTHER_STATS SystemStat[64][2];

long LastUpdate;
}STATS;

誰かがマッピングを達成する方法についていくつかの光を当てることができますか? C++ 型から C# 型へのマッピングは、私にとっては問題ありません。

ただし、ネストされた構造体をマップする方法と、必要な明示的な配列サイズについての手がかりがありません。

更新 1: 次の c# コードにマップすることができました:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct STATS
    {
        [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 128)]
        public OTHER_STATS[] SystemStat; //64x2
        public long LastUpdate;            
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct OTHER_STATS
    {
        [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 2)]
        public DIRECTIONAL_STATS[] DirectionStats;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
        public char[] Name;
        public int StatLength;
    }       

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
     public struct DIRECTIONAL_STATS
    {
        public UInt16 Data1;
        public UInt16 Data2;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
        public double[] AverageData;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
        public UInt16[] NumColdRes;
    }        

多次元配列であるため、次のマッピングについては不明です。

public SENTRY_PERFORMANCE_STATS[] Sentry; //64x2

上記のマッピングを使用すると、例外なく実行できますが、OTHER_STATS にマッピングされたデータはすべて間違っています。

誰かが私が間違ったことを見ることができますか?

ありがとう。

4

0 に答える 0