1

最近我尝试在单声道(.NET for Linux 平台)中使用 p/invoke 编写一个简单的 OpenGL 应用程序,以了解它在 C# 上的工作原理(我已经在 windows 上成功完成了)。我听说过 tao 框架,但我不想要一个简单的“hello world”之类的程序。

我刚开始就卡住了。我 p/invoked 了一些 GL 函数以查看它们是否有效。我立即调用了 glClearColor 和 glClear 来查看它是否设置了 glGetError (由于那时 opengl 还没有被初始化)。

它只是崩溃并转储以下堆栈跟踪和其他调试信息,而不是调用该函数。不会抛出异常。

堆栈跟踪:

  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 是浮动的,因为我在标题中看到了它的声明。

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 回答