Загрузка неуправляемого C++ в C#. Ошибка при попытке чтения или записи в защищенную память
У меня есть функция C++, которая выглядит так
__declspec(dllexport) int ___stdcall RegisterPerson(char const * const szName)
{
std::string copyName( szName );
// Assign name to a google protocol buffer object
// Psuedo code follows..
Protobuf::Person person;
person.set_name(copyName);
// Error Occurs here...
std::cerr << person->DebugString() << std::endl;
}
Соответствующий код C# выглядит следующим образом...
[DllImport(@"MyLibrary.dll", SetLastError = true)]
public static unsafe extern int RegisterPerson([MarshalAs(UnmanagedType.LPTStr)]string szName)
Не уверен, почему это не работает. Моя библиотека C++ скомпилирована как многопоточная DLL с многобайтовой кодировкой.
Любая помощь будет оценена. Я видел, что это распространенная проблема в Интернете, но никакие ответы не приводят меня к решению моей проблемы.
Я был в состоянии успешно вызвать другую экспортированную функцию с теми же параметрами функции, которые экспортирует моя DLL, и эта работала нормально. Эта функция "регистрация человека" немного длиннее, чем другая экспортируемая функция, и по какой-то причине не работает.
1 ответ
Во-первых, определение функций C++ пропускает extern "C"
Если не указано, Pinvoke не может найти функцию из-за смешения имен в C++.
В качестве определения в C# вы указываете UnmanagedType.LPTStr, по умолчанию это будет широкий символ, но параметром в функции C++ RegisterPerson является char, вы должны изменить его на UnmanagedType.LPStr.
Более подробную информацию можно найти в библиотеке MSDN.