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

时间:2013-08-05 20:41:03

标签: c# interop

我正在尝试包装SDL2定义的this function

它的签名是

void SDL_AddEventWatch(SDL_EventFilter filter, void* userdata)

SDL_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已经停止工作”)。

可能导致崩溃的原因是什么?

1 个答案:

答案 0 :(得分:3)

 #define SDLCALL __cdecl

您的呼叫约定不匹配。您的本机代码需要__cdecl函数,但您的C#代码声明了一个将映射到__stdcall回调的委托。非托管代码互操作的默认值。你必须这样声明:

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate int EventFilter(IntPtr userData, IntPtr type);
相关问题