【发布时间】:2020-05-14 22:56:00
【问题描述】:
我正在尝试让非托管 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,具有相同的网络框架
【问题讨论】:
-
您是否检查过该程序是否有权访问 DLL 文件?我的意思是,DLL 文件是否位于程序可以在不需要任何特殊权限的情况下加载它的位置?另外,您想通过调用本机代码来实现什么目标?您这样做的原因是什么?
-
从 DLL 函数返回
std::string很可能会失败,即使调用它的语言是 C++,更不用说 C#。您的函数工作的唯一方法是如果调用语言是 C++和,调用您的函数的应用程序是使用相同的 C++ 编译器使用相同的构建选项构建的,和运行时使用的库是 DLL 版本。 -
std::string in C#?的可能重复
-
@MindSwipe 该程序可以访问 dll,它位于同一目录中。基本上该程序是一个审计工具,对主程序的要求之一是用户 CPU 支持指令集 SSE4.1 - 我认为实现这一点的唯一现实方法是通过使用 CPUID
-
停止返回只有
C++知道的类型,例如bool。 C++ 中的bool与 C# 中的bool不同。 C++ 中的bool的大小由使用的编译器确定。例如,您应该使用具有公认大小的已知类型,例如int32_t(32 位 int)。
标签: c# c++ pinvoke dllimport dllexport