Visual C ++ 2010 — Загрузка неуправляемого 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, и эта работала нормально. Эта функция «регистрация человека» немного длиннее, чем другая экспортируемая функция, и по какой-то причине не работает.

0

Решение

Во-первых, определение функций C ++ пропускает extern "C"если не указано, Pinvoke не может найти функцию из-за смешения имен в C ++.

В качестве определения в C # вы указываете UnmanagedType.LPTStr, по умолчанию это будет широкий символ, но параметром в функции C ++ RegisterPerson является char, вы должны изменить его на UnmanagedType.LPStr.

Подробнее можно найти в библиотеке MSDN.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]