[异常信息:调用C ++ Dll时出现System.AccessViolationException

问题描述 投票:0回答:1

我正在尝试使非托管C ++ DLL与我的C#项目一起使用,当通过VS2019中的调试器运行程序时,代码可以工作。在没有调试器的情况下运行时,应用程序在运行时崩溃,并且事件查看器向我提供了异常信息:调用C ++ Dll时出现System.AccessViolationException

我已经尝试更改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";
    }

}

((我知道这已经被问过几次了,在互联网上翻找后,我还没有发现任何可以帮助我的东西。)

编辑

DLL和项目都是x86,具有相同的网络框架

c# c++ pinvoke dllimport dllexport
1个回答
0
投票

您无法使用pinvoke返回类似std::string的C ++对象。可以使用多种选项使用pinvoke将文本返回给呼叫者:

  1. 返回COM BSTR。
  2. 返回由被调用者分配的C字符串。调用方将需要取消分配它。通过使用共享堆,或通过导出解分配器函数。
  3. 让调用者分配文本缓冲区,然后让被调用者填充它。

所有这些方法的示例都可以通过网络搜索轻松找到。

© www.soinside.com 2019 - 2024. All rights reserved.