我正在尝试使用此签名围绕方法编写一个包装器:
[DllImport("SDL2.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern unsafe Window* SDL_CreateWindow(string title, int x, int y, int w, int h, WindowFlags flags);
你会注意到它返回一个指向结构体的指针Window
。
如果我按原样公开这个方法,那么任何使用它的代码都必须被标记为不安全,我希望避免这种情况。因此,我编写了一个取消引用它的公共包装方法:
public static unsafe Window CreateWindow(string title, int x, int y, int w, int h, WindowFlags flags)
{
return *SDL_CreateWindow(title, x, y, w, h, flags);
}
但我不是 100% 确定这是在做什么。DLL 正在创建Window
对象;当我取消引用它时,它是否被复制回托管值类型对象?
我惊讶地发现我可以传递引用来代替指针,因为这非常有效:
[DllImport("SDL2.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_DestroyWindow")]
public static extern void DestroyWindow(ref Window window);
但是对于返回类型我不能这样做。无论如何,这样做是否安全?我想通过取消引用然后重新引用它,Window
当我将它传递回时DestroyWindow
,DLL 将无法找到要销毁的正确对象,因为内存会被转移;但是看到代码运行完美,我想这很好吗?
(实际上,在查看结构的定义方式后,我发现它有一个“id”,我假设它用作句柄,而不是指针本身)