PInvoke ошибка при маршалинге структуры со строкой в ​​ней

StackOverflow https://stackoverflow.com/questions/1223690

Вопрос

У меня есть структура 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.

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

Это было полезно?

Решение

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

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top