PInvoke ошибка при маршалинге структуры со строкой в ​​ней - PullRequest
3 голосов
/ 03 августа 2009

У меня есть структура C ++

struct UnmanagedStruct
{
   char* s;
   // Other members
};

и структура C #

struct ManagedStruct {
   [MarshalAs(UnmanagedType.LPStr)]
   string s;
   // Other members
}

библиотека C ++ выставляет

extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );

И это импортируется как

  [DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
  static extern ManagedStruct foo( string input );

Однако, когда я вызываю эту функцию, я получаю

MarshalDirectiveException не обработано

Подпись типа метода не совместима с PInvoke.

Дело в том, что этот вызов функции работает, если я удаляю символы * и строку s из структур.

1 Ответ

4 голосов
/ 03 августа 2009

Для этого типа сценария не используйте строку напрямую. Вместо этого переключите тип на значение IntPtr и используйте Marshal.PtrToStringAuto / Ansi / Uni в зависимости от ситуации. В этом случае, поскольку ваш нативный код использует char*, PtrToStringAnsi является лучшим выбором.

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
...