PInvoke ошибка при маршалинге структуры со строкой в ней
-
11-07-2019 - |
Вопрос
У меня есть структура 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); } }
}
Не связан с StackOverflow