Как преобразовать мою структуру C ++ в структуру C #? - PullRequest
0 голосов
/ 17 октября 2019

Я понимаю, что это проблема, похожая на другие, но структура в C ++ (которую я сам не создал) отличается от структуры, с которой я столкнулся на этом сайте. Короче говоря, как мне преобразовать структуру C ++ в C #.

Я использовал [FieldOffset (0)] для объединения и вводил каждую часть структуры в том же порядке, что и в C #. Я также попытался сделать структуру небезопасной для размещения в пустоте *.

typedef struct {

    int rFlags,
        rType,
        rEvent,
        rSocket;
    TCHAR  rMsg[256];
    int rFrameWidth,
        rFrameHeight;
    short* rFrameBuffer;
    union {
        int rCaptureRows;
        int rCaptureFrames;
    };
    int rCapturePercent;
    void* rUserCallBackProc,
        * rUserParam;
    int rAborted;
    void* rPacketData;
    int rFGControl;

} tVDACQ_CallBackRec;

РЕДАКТИРОВАТЬ:

[StructLayout(LayoutKind.Explicit, Size = 64)]
        public unsafe struct tVDACQ_CallBackRec
        {
            [FieldOffset(0)]
            public int rFlags;
            [FieldOffset(4)]
            public int rType;
            [FieldOffset(8)]
            public int rEvent;
            [FieldOffset(12)]
            public int rSocket;
            [FieldOffset(16)]
            [System.Runtime.InteropServices.MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
            public char[] rMsg; //I assume this is part of the problem 
             [FieldOffset(20)]
            public int rFrameWidth;
            [FieldOffset(20)]
            public int rFrameHeight; 
            [FieldOffset(24)] //As well as this as I've read that short * -> short[] is a 'no go'
            [System.Runtime.InteropServices.MarshalAs(UnmanagedType.ByValArray, SizeConst = 1298304)]
            public short[] rFrameBuffer;
            [FieldOffset(24)]
            public int rCaptureRows;
            [FieldOffset(32)]
            public int rCaptureFrames; 
            [FieldOffset(36)]
            public int rCapturePercent;
            [FieldOffset(40)]
            public void* rUserCallBackProc;
            [FieldOffset(44)]
            public void* rUserParam;
            [FieldOffset(48)]
            public int rAborted;
            [FieldOffset(52)]
            public void* rPacketData;
            [FieldOffset(56)]
            public int rFGControl;            
        }


I expect the function from the dll (which is also not mine) to return the struct which will later be used in the script.


1 Ответ

0 голосов
/ 17 октября 2019

Определенно плохая идея пытаться маршалировать указатели c ++ на массивы в C #. Вы должны попробовать это:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct tVDACQ_CallBackRec
{
  public int rFlags;
  public int rType;
  public int rEvent;
  public int rSocket;

  [System.Runtime.InteropServices.MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
  public string rMsg;

  public int rFrameWidth;
  public int rFrameHeight;

  public IntPtr rFrameBuffer;

  public int rCaptureRowsFrames_union; 
  public int rCapturePercent;

  public IntPtr rUserCallBackProc;
  public IntPtr rUserParam;

  public int rAborted;

  public IntPtr rPacketData;

  public int rFGControl;            
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...