OSx 单声道 gtk 你好世界。 Gtk.Container 抛出异常

Posted

技术标签:

【中文标题】OSx 单声道 gtk 你好世界。 Gtk.Container 抛出异常【英文标题】:OSx mono gtk hello world. An exception was thrown for Gtk.Container 【发布时间】:2015-01-20 04:05:02 【问题描述】:

在新安装后试用 Mono 中的 hello world 示例。按照 [http://www.mono-project.com/docs/getting-started/mono-basics/][1]:

的说明尝试了 GTK 示例
mcs hello.cs -pkg:gtk-sharp-2.0
mono hello.exe

我明白了:

> 2014-11-21 21:45:29.629 mono[45107:1731007] *** WARNING: Method
> userSpaceScaleFactor in class NSView is deprecated on 10.7 and later.
> It should not be used in new applications. Use convertRectToBacking:
> instead. 
> 
> Unhandled Exception: System.TypeInitializationException: An exception
> was thrown by the type initializer for Gtk.Container --->
> System.DllNotFoundException: gtksharpglue-2   at (wrapper
> managed-to-native)
> Gtk.Container:gtksharp_gtk_container_get_focus_child_offset ()   at
> Gtk.Container..cctor () [0x00000] in <filename unknown>:0    --- End
> of inner exception stack trace ---   at Gtk.Bin..ctor (IntPtr raw)
> [0x00000] in <filename unknown>:0    at Gtk.Window..ctor (WindowType
> type) [0x00000] in <filename unknown>:0    at Gtk.Window..ctor
> (System.String title) [0x00000] in <filename unknown>:0    at
> Hello.Main () [0x00000] in <filename unknown>:0  [ERROR] FATAL
> UNHANDLED EXCEPTION: System.TypeInitializationException: An exception
> was thrown by the type initializer for Gtk.Container --->
> System.DllNotFoundException: gtksharpglue-2   at (wrapper
> managed-to-native)
> Gtk.Container:gtksharp_gtk_container_get_focus_child_offset ()   at
> Gtk.Container..cctor () [0x00000] in <filename unknown>:0    --- End
> of inner exception stack trace ---   at Gtk.Bin..ctor (IntPtr raw)
> [0x00000] in <filename unknown>:0
>    at Gtk.Window..ctor (WindowType type) [0x00000] in <filename
> unknown>:0 
>       at Gtk.Window..ctor (System.String title) [0x00000] in <filename unknown>:0 
>       at Hello.Main () [0x00000] in <filename unknown>:0

知道是什么原因造成的吗?

【问题讨论】:

【参考方案1】:

Jonathan Pryor 在Xamarin forum 中很好地回答了这个问题。他回答中的这些内容帮助了我:

您没有导出 $DYLD_LIBRARY_PATH 或 $DYLD_FALLBACK_LIBRARY_PATH 以便可以找到它。

...

问题是找不到 libgtk-quartz-2.0.0.dylib,因为它安装到 /Library/Frameworks/Mono.framework/Libraries,而不是 /usr/lib(或任何全局)。

首先在您的 shell 中运行以下命令,然后 mono hello.exe 应该可以工作:

export DYLD_FALLBACK_LIBRARY_PATH=/Library/Frameworks/Mono.framework/Versions/Current/lib:/lib:/usr/lib

【讨论】:

请注意,Jonathan 建议创建一个脚本(见下文)。我的经验是 OS X 不能很好地处理涉及 DYLD 变量的环境更改。【参考方案2】:

第一条错误信息,

“NSView 类中的 userSpaceScaleFactor 在 10.7 及更高版本中已弃用”

GTK 用户可以忽略。但是,GTK 开发者社区必须在 Apple 删除引用的调用之前更新他们的代码。

Apple Dev Community Notices re userSpaceScaleFactor

用于隔离第二个问题的脚本。不要忘记 chmod +x 。

#!/bin/zsh
export DYLD_FALLBACK_LIBRARY_PATH=/Library/Frameworks/Mono.framework/Versions/Current/lib:/lib:/usr/lib

mono $1.exe

【讨论】:

以上是关于OSx 单声道 gtk 你好世界。 Gtk.Container 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

mono gtk# - hello world部署到windows

java - 如何在Java响应式中为通量/单声道调用多个服务?

C指针原理(26)-gtk

在 OSX 上将新的 GTK 3 窗口置于前台

如何在 OSX 上安装 python-gtk2、python-webkit 和 python-jswebkit

Android音视频系列(七):PCM音频单声道与双声道的相互转换