Mik*_*sch 7 c# mono framebuffer gtk# cairo
我开始在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));
// ...
}
Run Code Online (Sandbox Code Playgroud)
我希望这会生成一个异常,表明null不允许参数值,但是看起来好像DirectFBSurface没有实现Mono.Cairo或没有编译到Debian Wheezy(armel)附带的库中:
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
Run Code Online (Sandbox Code Playgroud)
所以看起来这种Mono.Cairo方法可能无法满足我的需求,如上所述,GTK#Framebuffer库似乎不是Armel的Debian Wheezy的一部分.是否有另一组库可用于从Mono访问Linux Framebuffer?
您得到的结果EntryPointNotFoundException意味着cairo_directfb_surface_create在 debian 的 libcairo.so.2 库中找不到以 (IntPtr, IntPtr) 作为参数的符号。如果在 cairo 中编译时未启用 directfb,则可能会出现这种情况。您可以通过执行以下操作来检查 cairo 中的 directfb 支持:
readelf -Ws /usr/lib/libcairo.so.2 | grep directfb
Run Code Online (Sandbox Code Playgroud)
如果结果(输出)为空,则说明您缺少 directfb 支持。在这种情况下,您必须重新编译 cairo,并将--enable-directfb参数传递给配置脚本。
我已经在 openSUSE 12.1 和 Fedora 17 机器上进行了测试,默认情况下两者似乎都没有提供启用 directfb 的 cairo。不过我不知道debian,你必须自己测试一下。