C # моно р / сбой вызова - PullRequest
1 голос
/ 12 мая 2009

Недавно я попытался использовать p / invoke in mono (.NET для платформы Linux), чтобы написать простое приложение OpenGL, чтобы выяснить, как оно работает на C # (я уже успешно сделал это на Windows). Я слышал о фреймворке Дао, но я не хочу все для простой программы типа «привет мир».

Я просто застрял в начале. Я вызвал некоторые функции GL, чтобы посмотреть, работают ли они. Я немедленно вызвал glClearColor и glClear, чтобы увидеть, устанавливает ли он glGetError или нет (из-за opengl на тот момент не инициализировался вообще).

Вместо вызова функции просто происходит сбой и выводится следующая трассировка стека и другие данные debuginfo. Исключение не выбрасывается.

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>

Подпись для 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, как я видел его объявление в заголовке.

Ответы [ 2 ]

3 голосов
/ 13 мая 2009

Вы можете запустить программу с помощью gdb и точно увидеть, где происходит SEGV (см. Инструкции в моно wiki ).

Вероятная причина в том, что какое-то другое некорректное объявление p / invoke и вызов в коде испортили память, поэтому позже вы получите сбой.

0 голосов
/ 05 марта 2011

Я узнал это. Я использовал неправильную сигнатуру функции при выполнении p / invoke.

...