使用C#访问C DLL时,间歇性访问违规

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

本文关键字:访问 DLL 使用      更新时间:2023-10-16

我正在从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();

此测试的工作时间非常完美,然后突然间。

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方法。通常,在此方法中,DLL的"全局"变量是初始化的,因此必须称为一次的方法。通常将此方法称为至少两次:当加载DLL时DLL_PROCESS_ATTACHDLL_PROCESS_DETACH时,该过程结束/DLL卸载时。