我开始在Mono框架下为Linux编写一个小应用程序,该应用程序基本上是一个小型的kiosk前端,用户交互非常少。这是为了替换基于100%文本/控制台的同一应用程序的先前版本。
由于这将在Raspberry Pi上运行,我想避免运行X并让我的应用程序直接与Framebuffer对话。我开始使用Mono框架和C#作为我的开发语言,因为我非常了解C#。在这种情况下,可移植性不是问题。
我在查找适当的库和绑定时遇到了一些麻烦,让我从Mono访问Framebuffer。 GTK#
库都明确绑定到X11接口,无论如何,在Debian Wheezy中似乎没有为ARM Soft-Float(armel)架构预构建的GtkFB库。
Mono.Cairo
库公开DirectFBSurface
类型,但该表面的构造函数需要两个IntPtr
参数,并且没有记录,因此我不知道应该将哪些内容传递给构造函数将Framebuffer正确初始化为Cairo Surface。
有没有人使用Mono和C#与Linux Framebuffer交谈,如果有的话,你能提供基本的例子来初始化并开始绘制到FB上,或指向在线文档来协助吗?
更新1
我以为我会尝试使用null
为两个构造函数参数实例化DirectFBSurface,并使用以下代码:
public static void Main(string[] args)
{
// ...
DirectFBSurface surface = new DirectFBSurface(((IntPtr)null), ((IntPtr)null));
// ...
}
我希望这会生成一个异常,表明不允许null
个参数值,但是它看起来好像DirectFBSurface要么没有在Mono.Cairo
中实现,要么没有编译到随附的库中Debian Wheezy(阿梅尔):
Unhandled Exception: System.EntryPointNotFoundException: cairo_directfb_surface_create
at (wrapper managed-to-native) Cairo.NativeMethods:cairo_directfb_surface_create (intptr,intptr)
at Cairo.DirectFBSurface..ctor (IntPtr dfb, IntPtr dfb_surface) [0x00000] in <filename unknown>:0
at Info.Insch.SandBox.TestCairo.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0
所以似乎Mono.Cairo
方法可能无法满足我的需求,如上所述,GTK#
Framebuffer库似乎不是Armel的Debian Wheezy的一部分。是否有另一组库可用于从Mono访问Linux Framebuffer?
答案 0 :(得分:2)
你得到的EntryPointNotFoundException
意味着在debian的libcairo.so.2库中找不到带有(IntPtr,IntPtr)作为参数的符号cairo_directfb_surface_create
。如果在cairo的编译时没有启用directfb,情况可能就是这种情况。您可以通过执行以下操作检查cairo中的directfb支持:
readelf -Ws /usr/lib/libcairo.so.2 | grep directfb
如果结果(输出)为空,则缺少directfb支持。在这种情况下,您必须使用传递给configure脚本的--enable-directfb
参数重新编译cairo。
我已在openSUSE 12.1和Fedora 17上测试过,默认情况下两者似乎都没有发布directfb启用的cairo。我不知道debian,你必须自己测试一下。