Структура выделения с const char * в неуправляемом коде возвращает System.AccessViolationException - PullRequest
0 голосов
/ 06 января 2020

В C# структура со строковым членом выглядит следующим образом: publi c struct EDNetBuf {

  [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]

    public string dummy;

    public delegate void finalizeDelegate(System.IntPtr @object);
    public finalizeDelegate finalize;


    public readonly int _ref;
    public EDNetEventType type;

    public uint len;


    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]
    public string data;

}

[System.Runtime.InteropServices.StructLayoutAttribute (System.Runtime.InteropServices.LayoutKind.Sequential )]

 public struct EDNetFrame
{
    public EDNetBuf buf; //*< a buffer, the base object

    public uint timestamp; //*< timestamp
    public byte channel; //*< channel number
    public byte ptype; //*< payload, see #EDNetCodecID
    public ushort flags; //*< flags, see Flag

    public int fmt; //*< format, see #EDNetFrameFormat
    public int width; //*< The width of video frame
    public int height; //*< The height of video frame
}

У меня неуправляемый c код, из которого я преобразовал C# код следующим образом:

struct EDNetBuf
{
  /**
   * private data. NEVER MODIFY THIS!
   */

  const char *dummy;
  /**
   * private data. NEVER MODIFY THIS!
   */
  void (*finalize) (void *object);
  /**
   * private data. NEVER MODIFY THIS!
   */
  int _ref;
  /**
   * the length of buffer data.
   */
  unsigned int len;

  /**
   * the pointer to buffer data.
   */
  char *data;
};

In C# Когда я выполняю маршал с помощью:

f = (EDNetFrame) System. System.AccessViolationException произошла в mscorlib.dll Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена .. '

Я обнаружил, что это из-за фиктивной строки члена структуры. Как решить эту ошибку?

...