Как продолжение моего недавнего вопроса об отладке .NET Compact Framework, в настоящее время я пытаюсь использовать OpenGL ES как из .NET Compact Framework, так и из приложения .NET Framework. Я использую эту оболочку , которая была создана для OpenGL ES и импортируется из libGLES_CM.dll.
Чтобы упростить отладку, я создал приложение .NET Framework, воссоздал проект импорта для OpenGL ES и EGL с теми же файлами (только сборка для Desktop Framework), создал константы для имен DLL, чтобы они импортировались из libGLESv2 .dll и libEGL.dll в Windows и из libGLES_CM.dll в CF. Библиотеки DLL взяты из PowerVR OpenGL ES Emulation SDK (целевое устройство имеет PowerVR SGX) и являются просто оболочкой OpenGL ES для реальной реализации OpenGL. И тут возникает проблема:
В библиотеке-обертке функции OpenGL находятся в двух статических классах (gl и egl) и имеют обычное имя, но без префикса gl / egl, поэтому их вызов будет egl.GetDisplay()
вместо egl.eglGetDisplay()
. Они импортируются так:
[DllImport(DllName, EntryPoint = "eglGetDisplay")]
static extern IntPtr GetDisplay(EGLNativeDisplayType display_id);
Это отлично работает на Compact Framework. В настольном проекте выдается исключение EntryPointNotFoundException - потому что функции называются как _eglGetDisplay@4
(примечание: WMD ловит Alt-Gr + Q для цитат, что является символом at на немецких раскладках клавиатуры. Мне пришлось вставьте это.) в соответствии с Уокером Зависимости.
Мне удалось добавить подчеркивание к имени функции для настольного проекта, но не для CF, путем условной установки строковой константы в пустую строку или "_" и конкатенации ее и имени точки входа, поэтому это выглядит так:
[DllImport(DllName, EntryPoint = FunctionPrefix + "eglGetDisplay")]
Здесь нет проблем. Но функция все еще не найдена, потому что @ 4 (что это такое?) Отсутствует. Если я добавлю @ 4, это сработает, но поскольку все функции имеют разные значения, я должен был сделать это вручную, и, вероятно, числа будут неправильными для версии CF. Вот странная часть:
Если я просто не укажу точку входа и вместо этого назову функцию так, как она должна быть названа, импорт работает нормально! Теперь это ужасно из-за двойного префикса (статического имени класса и имени функции), хотя я мог бы обойти это, просто добавив обертку для этого. Поскольку я не буду сильно полагаться на эти функции (нужен только довольно простой 2D-движок), это не будет проблемой, но это просто не правильно.
Почему не работает при указании точки входа? Что я могу сделать, чтобы он работал так, как должен?