.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 エミュレーション SDK (ターゲット デバイスには PowerVR SGX があります) からのものであり、実際の OpenGL 実装の単なる OpenGL ES ラッパーです。そして、ここに問題があります:
ラッパー ライブラリでは、OpenGL 関数は 2 つの静的クラス (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をキャッチします。これはドイツ語のキーボードレイアウトのアットマークです。これを貼り付ける必要がありました。)ディペンデンシー ウォーカーへ。
条件付きで文字列定数を空の文字列または「_」に設定し、それとエントリポイント名を連結することにより、デスクトッププロジェクトの関数名にアンダースコアを追加できましたが、CF のものには追加できませんでした。これ:
[DllImport(DllName, EntryPoint = FunctionPrefix + "eglGetDisplay")]
ここでは問題ありません。しかし、@4 (正確には何ですか?) がないため、関数はまだ見つかりません。@4 を追加するとうまくいきますが、ここではすべての関数の値が異なるため、これを手動で行う必要があり、CF バージョンでは数値が正しくない可能性があります。ここに奇妙な部分があります:
エントリ ポイントを指定せず、代わりに関数に名前を付ける必要がある場合、インポートは正常に機能します。これは二重の接頭辞 (静的クラス名と関数名) のために醜いですが、これにラッパーを追加するだけでこれを回避できます。私はこれらの関数に大きく依存しないので (かなり単純な 2D エンジンのみが必要です)、これは問題にはなりませんが、正しくないと感じます。
エントリ ポイントを指定すると機能しないのはなぜですか? 本来のように機能させるにはどうすればよいですか?