C# 为什么我的程序在调用委托后立即崩溃?

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,

我正在尝试包装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, 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。你最好知道,这样你就不用猜了。