Информация об исключении: System.AccessViolationException при вызове C ++ Dll - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь заставить неуправляемую C ++ DLL работать с моим C# проектом, при запуске программы через отладчик в VS2019 код работает. При запуске без отладчика приложение аварийно завершает работу при запуске и средство просмотра событий выдает мне информацию об исключении: System.AccessViolationException при вызове C ++ Dll

Я попытался изменить способ использования p / invoke с изменениями того, что у меня есть, хотя могло бы сделай так, чтоб это работало. C ++ не является моей сильной стороной, но DLL не представляет собой ничего сложного и представляет собой просто оператор if, возвращающий строку.

Кто-нибудь может увидеть, где я ошибся здесь? Или предложить какие-либо советы по устранению этой проблемы?

C#

[DllImport("unmanaged.dll", EntryPoint = "checkCPU", CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr checkCPU();

// to call it

 string check = Marshal.PtrToStringAnsi(checkCPU());

C ++

extern "C" __declspec(dllexport) std::string checkCPU()
{

    if (InstructionSet::SSE41() || InstructionSet::SSE42()) {
        return "true";
    }
    else {
        return "false";
    }

}

(я знаю, что об этом уже спрашивали несколько раз , покопавшись в inte rnet я не нашел ничего, что могло бы мне помочь.)

Edit

И DLL, и проект - x86, с одной и той же сетевой структурой

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Спасибо всем за ваши комментарии, на самом деле из-за того, что я немного тупой.

C ++ должен был быть BOOL, а не bool.

c# нормально был bool.

Теперь есть новая проблема, но прогресс.

Еще раз спасибо.

0 голосов
/ 29 января 2020

Вы не можете вернуть объект C ++, такой как std::string, используя pinvoke. Существует множество вариантов возврата текста вызывающей стороне с помощью pinvoke:

  1. Возврат COM BSTR.
  2. Возвращение строки C, выделенной вызываемой стороной. Звонящий должен будет освободить его. Либо с помощью общей кучи, либо путем экспорта функции deallocator.
  3. Пусть вызывающий объект выделит текстовый буфер, и пусть вызываемый объект заполнит его.

Примеры всех этих подходов может быть легко найден websearch.

Я предполагаю, что ваш код является упрощенным примером, но если вы действительно хотите указать просто успех или неудачу, то вы можете полностью обойти проблему, вернув логическое значение тип.

...