使用 C# 访问 C++ DLL 时出现间歇性访问冲突

Intermittent Access Violation when using C# to access C++ DLL

我正在从 c# 链接到一个相当复杂的 c++ dll。我需要创建很多 dllexport 函数,以便我可以在 c# 中使用 dll。首先,我添加了一个 .cpp 文件并创建了一个简单的测试函数:

c++:

extern "C" __declspec(dllexport) int32_t Test(){
    return 10;
}

c#:

[STAThread]
static void Main()
{
    Console.WriteLine(Test());
}

[DllImport("Test.dll", EntryPoint = "Test", CallingConvention = CallingConvention.Cdecl,ExactSpelling = true)]
public static extern Int32 Test();

此测试在 90% 的时间里都能完美运行,然后突然....

The program '[4712] Test.vshost.exe' has exited with code -1073741819 (0xc0000005) 'Access violation'.

一切似乎都很好,不知道是什么原因造成的,甚至不知道如何开始追踪问题。这么断断续续的,真是奇怪。我真的不是 C++ 程序员,所以我不知道是什么导致了这种行为,甚至不知道如何调试和发现问题。

希望有好心人帮帮忙

这个

SetLastError = true

没有用,除非你使用 Windows API.

并设置

CallingConvention = CallingConvention.Cdecl

喜欢

[DllImport("Test.dll", EntryPoint = "Test", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]

请注意,除您的方法外,还有其他代码可以执行。 DLL 可以(而且经常)有一个 DllMain 方法。通常在这个方法中 "global" dll 的变量被初始化,并且必须被调用一次的方法也是如此。此方法通常至少调用两次:DLL_PROCESS_ATTACH 加载 dll 时调用 DLL_PROCESS_DETACH 进程 ends/the dll 卸载时调用。