我正在尝试使非托管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,具有相同的网络框架
您无法使用pinvoke返回类似std::string
的C ++对象。可以使用多种选项使用pinvoke将文本返回给呼叫者:
所有这些方法的示例都可以通过网络搜索轻松找到。