2009-05-12 6 views
1

最近では、単純なOpenGLアプリケーションを書くためにmono(.NET用Linuxプラットフォーム)でp/invokeを使って、C#での動作を調べました(私はすでにうまくウィンドウ)。私はtaoフレームワークについて聞いたが、プログラムのようなシンプルな "こんにちはの世界"のためにすべてを望んでいない。C#mono p/invoke failure

私はちょうど始めに立ち往生しました。私はいくつかの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フロートあります。

+0

@ps:どちらもまだ私のためにあります(Firefox 3.0)。 – OregonGhost

+0

C#でメソッドを宣言した方法と、ピンポークしているCメソッドのシグネチャを追加する必要があります。 –

+0

署名が追加されました – Calmarius

答えて

3

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

おそらく、他の誤ったp/invoke宣言を呼び出し、コードを呼び出してメモリが破損し、後でクラッシュする可能性があります。

0

私はそれを見つけました。 p/invokeを実行するときに間違った関数の署名を使用しました。