C# Can';在';SDL.DLL';与平沃克

C# Can';在';SDL.DLL';与平沃克,c#,dll,pinvoke,sdl,C#,Dll,Pinvoke,Sdl,我正在尝试在SDL和我的C#NET程序之间封送数据。我对SDL.DLL的前几个调用工作正常,因为我没有收到任何错误,并且我的Windows控制台应用程序确实打开了一个空的应用程序窗口: My_SDL_Funcs.SDL_Init(0x0000FFFF); // SDL_INIT_EVERYTHING IntPtr scrn = My_SDL_Funcs.SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, 0x00000000); /

我正在尝试在SDL和我的C#NET程序之间封送数据。我对SDL.DLL的前几个调用工作正常,因为我没有收到任何错误,并且我的Windows控制台应用程序确实打开了一个空的应用程序窗口:

My_SDL_Funcs.SDL_Init(0x0000FFFF); // SDL_INIT_EVERYTHING
IntPtr scrn = My_SDL_Funcs.SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, 0x00000000); // SDL_SWSURFACE
screen = (SDL_Surface)Marshal.PtrToStructure(scrn, typeof(SDL_Surface));
My_SDL_Funcs.SDL_WM_SetCaption("Hello World", null);
// ...
但是,当我尝试调用SDL_LoadBMP()时,出现以下运行时错误:

在DLL“SDL”中找不到名为“SDL\U LoadBMP”的入口点

SDL文档说明SDL_LoadBMP采用const char*文件名,并返回指向SDL_曲面结构的指针

我第一次尝试将PInvoke声明为:

[DllImport("SDL", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr SDL_LoadBMP([MarshalAs(UnmanagedType.LPWStr)] string file);
当这不起作用时,我尝试:

public static extern IntPtr SDL_LoadBMP(IntPtr file);
并使用:

IntPtr fn = Marshal.StringToHGlobalAnsi(filename);
IntPtr loadedImage = My_SDL_Funcs.SDL_LoadBMP(fn);

假设函数actuall确实存在于该库中(SDL.DLL版本1.2.14),是否对常量字符*使用了错误的调用?

我下载了您正在使用的DLL版本,但找不到SDL\u LoadBMP的导出

不过,有一个SDL_LoadBMP_RW,因此您可以像这样装配自己的助手调用:

private const string SDL = "SDL.dll";

[DllImport(SDL, CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern IntPtr SDL_LoadBMP_RW(IntPtr src, int freesrc);

[DllImport(SDL, CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern IntPtr SDL_RWFromFile(string file, string mode);

public static IntPtr SDL_LoadBMP(string file)
{
    return SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1);
}
更新

我查看了代码,您正在查找的调用被定义为宏,因此不能直接调用它。使用上述代码与宏定义基本相同:

#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1)

你说的代码运行了好几次。。你能把那个贴出来吗。。除非我没有看到它。。听起来可能是释放封送实例或试图调用my的某个方法的问题,也可能不是静态方法。。但是我愿意猜测您没有正确地释放非托管资源。@DJ KRAZE-我修改了原始问题,将工作呼叫包括在内。酷,我还同意@GalacticJello的回答,我不认为在我自己的本地尝试呼叫。。很好,这太奇怪了,因为我在这里建立并运行了关于表面加载和光碟的Lazy Foo SDL课程——它肯定会调用SDL_LoadBMP。我的机器上有几个SDL版本,但我永远不知道如何知道Windows正在使用哪个版本的DLL。其中一个有一个称为SDL_Image.dll的dll。我想知道这个函数是否在某个版本中被移动到了那里。它实际上不是一个导出函数,而是定义为一个宏,这就是为什么你不能从C#调用它。是的,你的帖子让我搜索了SDL标题,我也发现了:#define SDL_LoadBMP(file)SDL_LoadBMP_RW(SDL_RWFromFile(file,“rb”),1)如上所述,捕捉得很好!