2009-05-12 10 views
1

Kürzlich habe ich versucht, p/invoke in Mono (.NET für Linux-Plattform) zu verwenden, um eine einfache OpenGL-Anwendung zu schreiben, um herauszufinden, wie es auf C# funktioniert (ich habe es bereits erfolgreich unter Windows getan). Ich habe von dem tao Rahmen gehört, aber ich will nicht alles für ein einfaches "Hallo Welt" Programm.C# mono p/invoke Fehler

Ich steckte einfach am Anfang. Ich habe einige GL-Funktionen aufgerufen, um zu sehen, ob sie funktionieren. Ich habe sofort glClearColor und glClear aufgerufen, um zu sehen, ob es glGetError setzt (wegen opengl wurde zu diesem Zeitpunkt überhaupt nicht initialisiert).

Anstatt die Funktion aufzurufen, stürzt sie ab und speichert die folgenden Stack-Traces und andere Debuginfo. Es wird keine Ausnahme ausgelöst.

Stacktrace:

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> 

Die Signatur für glClearColor ist:

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

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

C-Spezifikation ist:

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

GLclampf ist Schwimmer, wie ich seine Erklärung im Header sah.

+0

@ps: Beide sind immer noch für mich da (Firefox 3.0). – OregonGhost

+0

Sie sollten hinzufügen, wie Sie die Methode in C# deklariert haben, und die Signatur der C-Methode, an die Sie anheften. –

+0

Signatur hinzugefügt – Calmarius

Antwort

3

Sie könnten das Programm mit gdb ausführen und genau sehen, wo das SEGV passiert (siehe Mono wiki für Anweisungen).

Eine wahrscheinliche Ursache ist, dass einige andere falsche p/Invoke-Deklaration und Aufruf in den Code beschädigt Speicher so später Sie den Absturz bekommen.

0

Ich fand es heraus. Ich habe eine falsche Funktionssignatur verwendet, wenn p/invoke ausgeführt wurde.