作为我最近关于 .NET Compact Framework 调试的问题的后续,我目前正在尝试从 .NET Compact Framework 和 .NET Framework 应用程序中使用 OpenGL ES。我使用这个包装器,它是为 OpenGL ES 创建并从 libGLES_CM.dll 导入的。
为了使调试更容易,我创建了一个 .NET Framework 应用程序,使用相同的文件重新创建了 OpenGL ES 和 EGL 的导入项目(只是为桌面框架构建),为 DLL 名称创建了常量,以便它们将从 libGLESv2.dll 和Windows 上的 libEGL.dll 和 CF 上的 libGLES_CM.dll。DLL 来自 PowerVR OpenGL ES Emulation SDK(目标设备具有 PowerVR SGX)并且只是围绕真实 OpenGL 实现的 OpenGL ES 包装器。问题来了:
在包装器库中,OpenGL 函数位于两个静态类(gl 和 egl)中,并具有通常的名称,但没有 gl/egl 前缀,因此调用它们将egl.GetDisplay()
代替egl.eglGetDisplay()
. 它们是这样导入的:
[DllImport(DllName, EntryPoint = "eglGetDisplay")]
static extern IntPtr GetDisplay(EGLNativeDisplayType display_id);
这在 Compact Framework 上运行良好。根据_eglGetDisplay@4
_ _到 Dependency Walker。
我设法将下划线添加到桌面项目的函数名称中,但不是为 CF 项目,通过有条件地将字符串常量设置为空字符串或“_”,并将它和入口点名称连接起来,所以它看起来像这:
[DllImport(DllName, EntryPoint = FunctionPrefix + "eglGetDisplay")]
这里没问题。但是仍然找不到该函数,因为缺少@4(那到底是什么?)。如果我添加@4,这可行,但由于这里所有函数都有不同的值,我必须手动执行此操作,并且对于 CF 版本,这些数字可能不正确。奇怪的部分来了:
如果我只是不指定入口点,而是将函数命名为应该命名的函数,则导入工作正常!现在这很丑,因为有双重前缀(静态类名和函数名),尽管我可以通过为此添加一个包装器来解决这个问题。因为我不会严重依赖这些功能(只需要一个相当简单的 2D 引擎),这不会是一个问题,但它只是感觉不对。
为什么指定入口点时不起作用?我该怎么做才能让它像它应该的那样工作?