2009-05-12 7 views
1

Récemment, j'ai essayé d'utiliser p/invoke en mono (plate-forme .NET pour Linux) pour écrire une simple application OpenGL pour découvrir comment cela fonctionne sur C# (je l'ai déjà fait avec succès sur Windows). J'ai entendu parler du framework tao, mais je ne veux pas tout pour un simple programme "hello world".Echec mono/invoke C#

Je viens de me blottir au début. J'ai p/invoqué certaines fonctions de GL pour voir si elles fonctionnent. J'ai immédiatement appelé glClearColor et glClear pour voir s'il définit glGetError ou non (car opengl n'a pas été initialisé du tout à ce moment là). Au lieu d'appeler la fonction, elle plante et dépile la trace de pile suivante et d'autres informations de débogage au lieu de l'appeler. Aucune exception n'est levée.

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> 

La signature glClearColor est:

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

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

spécification C est:

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

GLclampf est flottant comme je l'ai vu sa déclaration dans l'en-tête.

+0

@ps: Les deux sont toujours là pour moi (Firefox 3.0). – OregonGhost

+0

Vous devez ajouter comment vous avez déclaré la méthode en C# et la signature de la méthode C que vous voulez épingler. –

+0

signature ajoutée – Calmarius

Répondre

3

Vous pouvez lancer le programme avec gdb et voir exactement où se produit le SEGV (voir le mono wiki pour les instructions).

Une cause probable est qu'une autre déclaration p/invoke incorrecte et appel dans le code corrompu de la mémoire si plus tard vous obtenez le crash.

0

Je l'ai découvert. J'ai utilisé une mauvaise signature de fonction lorsque je faisais p/invoke.

Questions connexes