Загрузка неуправляемого 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.

Другие вопросы по тегам