使用 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 卸载时调用。
我正在从 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 卸载时调用。