У меня есть функция 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, и эта работала нормально. Эта функция «регистрация человека» немного длиннее, чем другая экспортируемая функция, и по какой-то причине не работает.
Во-первых, определение функций C ++ пропускает extern "C"
если не указано, Pinvoke не может найти функцию из-за смешения имен в C ++.
В качестве определения в C # вы указываете UnmanagedType.LPTStr, по умолчанию это будет широкий символ, но параметром в функции C ++ RegisterPerson является char, вы должны изменить его на UnmanagedType.LPStr.
Подробнее можно найти в библиотеке MSDN.
Других решений пока нет …