1

最近、私はモノラル(Linuxプラットフォーム用の.NET)でp / invokeを使用して、C#でどのように機能するかを調べるための単純なOpenGLアプリケーションを作成しようとしました(すでにWindowsで成功しています)。taoフレームワークについて聞いたことがありますが、プログラムのような単純な「HelloWorld」にすべてが必要なわけではありません。

私は最初に立ち往生しました。いくつかのGL関数を呼び出して、それらが機能するかどうかを確認しました。私はすぐにglClearColorとglClearを呼び出して、glGetErrorが設定されるかどうかを確認しました(openglがその時点でまったく初期化されていないため)。

関数を呼び出す代わりに、クラッシュして次のスタックトレースと他のdebuginfoをダンプします。例外はスローされません。

スタックトレース:

  at (wrapper managed-to-native) Calmarius.OGL.OpenGLLibrary.glClearColor (single,single,single,single) <0x00004>
  at (wrapper managed-to-native) Calmarius.OGL.OpenGLLibrary.glClearColor (single,single,single,single) <0xffffffff>
  at Calmarius.RTS.GameForm.OnPaint (System.Windows.Forms.PaintEventArgs) [0x00000] in /home/calmarius/Development/csharp/RTS/RTS/Form1.cs:60
  at System.Windows.Forms.Control.WmPaint (System.Windows.Forms.Message&) <0x000b0>
  at System.Windows.Forms.Control.WndProc (System.Windows.Forms.Message&) <0x001e2>
  at System.Windows.Forms.ScrollableControl.WndProc (System.Windows.Forms.Message&) <0x0000d>
  at System.Windows.Forms.ContainerControl.WndProc (System.Windows.Forms.Message&) <0x00054>
  at System.Windows.Forms.Form.WndProc (System.Windows.Forms.Message&) <0x001da>
  at ControlWindowTarget.OnMessage (System.Windows.Forms.Message&) <0x00014>
  at ControlNativeWindow.WndProc (System.Windows.Forms.Message&) <0x00022>
  at System.Windows.Forms.NativeWindow.WndProc (intptr,System.Windows.Forms.Msg,intptr,intptr) <0x001b7>
  at System.Windows.Forms.XplatUIX11.DispatchMessage (System.Windows.Forms.MSG&) <0x00016>
  at System.Windows.Forms.XplatUI.DispatchMessage (System.Windows.Forms.MSG&) <0x00015>
  at System.Windows.Forms.Application.RunLoop (bool,System.Windows.Forms.ApplicationContext) <0x00997>
  at System.Windows.Forms.Application.Run (System.Windows.Forms.ApplicationContext) <0x0006a>
  at System.Windows.Forms.Application.Run (System.Windows.Forms.Form) <0x00025>
  at Calmarius.RTS.Program.Main () [0x0000b] in /home/calmarius/Development/csharp/RTS/RTS/Program.cs:19
  at (wrapper runtime-invoke) System.Object.runtime_invoke_void (object,intptr,intptr,intptr) <0xffffffff>

glClearColorの署名は次のとおりです。

//gllibname="opengl32.dll" --> mapped to libGL.so
[DllImport(gllibname)]

public static extern void glClearColor(float red, float green, float blue, float alpha);

C仕様は次のとおりです。

void glClearColor( GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha );

ヘッダーで宣言を見たように、GLclampfはfloatです。

4

2 に答える 2

3

gdb を使用してプログラムを実行し、SEGV が発生する場所を正確に確認できます (手順については、mono wikiを参照してください)。

原因として考えられるのは、他の不正な p/invoke 宣言とコードの呼び出しによってメモリが破損したため、後でクラッシュが発生したことです。

于 2009-05-13T07:17:45.860 に答える
0

私はそれを見つけました。p/invoke を実行するときに、間違った関数シグネチャを使用しました。

于 2011-03-05T12:34:33.693 に答える