Вопрос по c#, pinvoke, c++, marshalling, interop – PInvoke ошибка при маршалинге структуры со строкой в ней

3

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

Ваш Ответ

1   ответ
4

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

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
(Продолжение). В общем, если вы когда-либо не понимаете, каким образом строка должна быть упорядочена (и это не встроенный массив), используйте IntPtr и выполните ручное упорядочение строки. Это гораздо больше шансов на работу
Зачем мне это делать? Я задавал этот вопрос ранее, и все люди говорили, что он «просто сработает». DevDevDev
@SteveM, строки + PInvoke = сложно. Строки просто работают во многих сценариях, но не работают во многих других :). Строки как поля структуры особенно сложны, потому что существует огромная проблема управления памятью. В частности, что должен делать CLR с памятью, используемой для создания управляемой строки? Должно ли это освободить это или ничего не делать? В общем, если CLR видит что-то подобное, он предполагает, что ему нужно освободить данные, и в итоге вызовет CoTaskMemFree со значением, которое, вероятно, неверно в вашем сценарии.

Похожие вопросы