我目前正在使用 CppSharp,并为 SDL2 库生成了绑定。它几乎可以工作,但我无法使用库的事件部分。在 C 中,您只需像这样使用 API
SDL_Event event;
while(SDL_WaitEvent(&event))
{
if(e.type = SDL_QUIT)
exit(0);
}
但是在带有生成绑定的 C# 中,我做不到:
SDL.SDL_Event e = new SDL.SDL_Event();
while(SDL.SDL_WaitEvent(e))
{
if(e.Type == (uint)SDL.SDL_EventType.SDL_QUIT)
System.Environment.Exit(0);
}
它可以编译,但 e.Type 始终为零,这是不正确的,就像 C# 对象在内部永远不会改变。有没有办法让 C# 像 C 一样传递 SDL.SDL_Event 。
作为参考,这里是绑定(我不想更改它们,因为它们是由 CppSharp 生成的):
[SuppressUnmanagedCodeSecurity]
[DllImport("SDL2", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,EntryPoint="SDL_WaitEvent")]
internal static extern int SDL_WaitEvent(global::System.IntPtr @event);
public static int SDL_WaitEvent(global::SDL.SDL_Event @event)
{
var ____arg0 = @event.__Instance;
var __arg0 = new global::System.IntPtr(&____arg0);
var __ret = __Internal.SDL_WaitEvent(__arg0);
return __ret;
}
如何让事件循环在 C# 中工作?
编辑:SDL_Event 生成的结构
public unsafe partial struct SDL_Event
{
[StructLayout(LayoutKind.Explicit, Size = 56)]
public partial struct __Internal
{
[FieldOffset(0)]
internal uint type;
[FieldOffset(0)]
internal global::SDL.SDL_CommonEvent.__Internal common;
[FieldOffset(0)]
internal global::SDL.SDL_WindowEvent.__Internal window;
[FieldOffset(0)]
internal global::SDL.SDL_KeyboardEvent.__Internal key;
[FieldOffset(0)]
internal global::SDL.SDL_TextEditingEvent.__Internal edit;
[FieldOffset(0)]
internal global::SDL.SDL_TextInputEvent.__Internal text;
[FieldOffset(0)]
internal global::SDL.SDL_MouseMotionEvent.__Internal motion;
[FieldOffset(0)]
internal global::SDL.SDL_MouseButtonEvent.__Internal button;
[FieldOffset(0)]
internal global::SDL.SDL_MouseWheelEvent.__Internal wheel;
[FieldOffset(0)]
internal global::SDL.SDL_JoyAxisEvent.__Internal jaxis;
[FieldOffset(0)]
internal global::SDL.SDL_JoyBallEvent.__Internal jball;
[FieldOffset(0)]
internal global::SDL.SDL_JoyHatEvent.__Internal jhat;
[FieldOffset(0)]
internal global::SDL.SDL_JoyButtonEvent.__Internal jbutton;
[FieldOffset(0)]
internal global::SDL.SDL_JoyDeviceEvent.__Internal jdevice;
[FieldOffset(0)]
internal global::SDL.SDL_ControllerAxisEvent.__Internal caxis;
[FieldOffset(0)]
internal global::SDL.SDL_ControllerButtonEvent.__Internal cbutton;
[FieldOffset(0)]
internal global::SDL.SDL_ControllerDeviceEvent.__Internal cdevice;
[FieldOffset(0)]
internal global::SDL.SDL_AudioDeviceEvent.__Internal adevice;
[FieldOffset(0)]
internal global::SDL.SDL_QuitEvent.__Internal quit;
[FieldOffset(0)]
internal global::SDL.SDL_UserEvent.__Internal user;
[FieldOffset(0)]
internal global::SDL.SDL_SysWMEvent.__Internal syswm;
[FieldOffset(0)]
internal global::SDL.SDL_TouchFingerEvent.__Internal tfinger;
[FieldOffset(0)]
internal global::SDL.SDL_MultiGestureEvent.__Internal mgesture;
[FieldOffset(0)]
internal global::SDL.SDL_DollarGestureEvent.__Internal dgesture;
[FieldOffset(0)]
internal global::SDL.SDL_DropEvent.__Internal drop;
[FieldOffset(0)]
internal fixed byte padding[56];
[SuppressUnmanagedCodeSecurity]
[DllImport("SDL", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="??0SDL_Event@@QEAA@AEBT0@@Z")]
internal static extern global::System.IntPtr cctor(global::System.IntPtr instance, global::System.IntPtr _0);
}