C# 为什么我的程序在调用委托后立即崩溃?
我正在尝试包装SDL2定义的内容 它的签名是C# 为什么我的程序在调用委托后立即崩溃?,c#,interop,C#,Interop,我正在尝试包装SDL2定义的内容 它的签名是 void SDL_AddEventWatch(SDL_EventFilter filter, void* userdata) 其中SDL\u EventFilter为 typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event); 因此,我对包装器的定义如下: public delegate int EventFilter(IntPtr userData,
void SDL_AddEventWatch(SDL_EventFilter filter, void* userdata)
其中SDL\u EventFilter
为
typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event);
因此,我对包装器的定义如下:
public delegate int EventFilter(IntPtr userData, IntPtr type);
[DllImport("SDL2.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_AddEventWatch")]
public static extern void AddEventWatch(EventFilter filter, IntPtr userData);
我正在这样测试它:
SDL.AddEventWatch((data, e) =>
{
return 0;
}, IntPtr.Zero);
当我运行程序时,它实际上会进入lambda函数,但一旦退出该函数就会立即崩溃(“vshost32.exe已停止工作”)
是什么导致了这次事故
#define SDLCALL __cdecl
您的呼叫约定不匹配。本机代码需要一个u cdecl函数,但C代码声明了一个将映射到u stdcall回调的委托。非托管代码互操作的默认值。您必须这样声明:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int EventFilter(IntPtr userData, IntPtr type);
有什么例外?你在调试模式下检查了吗?@Pierre Luccinoult:我在调试模式下运行。这是C#interop,它正在调用一个用C编写的DLL。这是一个硬崩溃,没有例外。你检查过系统日志吗?你的委托声明只与一个u stdcall函数指针兼容。SDLCALL的含义尚不清楚。在委托上使用[UnmanagedFunctionPointer]属性使其匹配。不,它已经是这样了。如果你不知道SDLCALL是什么意思,那么猜猜Cdecl。你最好知道,这样你就不用猜了。