请教一下各位,
原来在 Fedora 17 KDE 下, 使用 mono 执行 KeePass; 现在系统换 openSUSE 了, 普通用户不能正常运行 KeePass, 但是 root 用户却可以正常运行, Google 很久报错信息, 也没有找到解决办法, 求破!
已安装 mono 相关的 rpm 包如下:
> rpm -qa | grep mono
mono-core-3.0.4-1.4.1.x86_64
mono-data-oracle-3.0.4-1.4.1.x86_64
mono-devel-3.0.4-1.4.1.x86_64
mono-nunit-3.0.4-1.4.1.x86_64
mono-wcf-3.0.4-1.4.1.x86_64
libmonosgen-2_0-devel-3.0.4-1.4.1.x86_64
monodoc-core-3.0.4-1.4.1.x86_64
mono-reactive-3.0.4-1.4.1.x86_64
mono-data-postgresql-3.0.4-1.4.1.x86_64
mono-extras-3.0.4-1.4.1.x86_64
mono-complete-3.0.4-1.4.1.x86_64
libmono-2_0-1-3.0.4-1.4.1.x86_64
mono-winfxcore-3.0.4-1.4.1.x86_64
mono-mvc-3.0.4-1.4.1.x86_64
mono-locale-extras-3.0.4-1.4.1.x86_64
mono-web-3.0.4-1.4.1.x86_64
mono-data-3.0.4-1.4.1.x86_64
mono-winforms-3.0.4-1.4.1.x86_64
libmono-2_0-devel-3.0.4-1.4.1.x86_64
mono-data-sqlite-3.0.4-1.4.1.x86_64
libmonosgen-2_0-0-3.0.4-1.4.1.x86_64
mono-entityframework-3.0.4-1.4.1.x86_64
报错信息如下:
> mono /usr/lib/keepass/KeePass.exe
Unhandled Exception:
System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.XplatUI ---> System.ArgumentNullException: Argument cannot be null.
Parameter name: key
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) [0x00000] in <filename unknown>:0
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) [0x00000] in <filename unknown>:0
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) [0x00000] in <filename unknown>:0
at System.Resources.ResourceManager.GetObject (System.String name, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
at System.Resources.ResourceManager.GetObject (System.String name) [0x00000] in <filename unknown>:0
at System.Windows.Forms.KeyboardLayouts.LoadLayouts () [0x00000] in <filename unknown>:0
at System.Windows.Forms.KeyboardLayouts.get_Layouts () [0x00000] in <filename unknown>:0
at System.Windows.Forms.X11Keyboard.DetectLayout (System.Windows.Forms.KeyboardLayouts layouts) [0x00000] in <filename unknown>:0
at System.Windows.Forms.X11Keyboard.EnsureLayoutInitialized () [0x00000] in <filename unknown>:0
at System.Windows.Forms.X11Keyboard..ctor (IntPtr display, IntPtr clientWindow) [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUIX11.SetDisplay (IntPtr display_handle) [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUIX11..ctor () [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUIX11.GetInstance () [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUI..cctor () [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Windows.Forms.Application.EnableVisualStyles () [0x00000] in <filename unknown>:0
at KeePass.Program.Main (System.String] args) [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.XplatUI ---> System.ArgumentNullException: Argument cannot be null.
Parameter name: key
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) [0x00000] in <filename unknown>:0
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) [0x00000] in <filename unknown>:0
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) [0x00000] in <filename unknown>:0
at System.Resources.ResourceManager.GetObject (System.String name, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
at System.Resources.ResourceManager.GetObject (System.String name) [0x00000] in <filename unknown>:0
at System.Windows.Forms.KeyboardLayouts.LoadLayouts () [0x00000] in <filename unknown>:0
at System.Windows.Forms.KeyboardLayouts.get_Layouts () [0x00000] in <filename unknown>:0
at System.Windows.Forms.X11Keyboard.DetectLayout (System.Windows.Forms.KeyboardLayouts layouts) [0x00000] in <filename unknown>:0
at System.Windows.Forms.X11Keyboard.EnsureLayoutInitialized () [0x00000] in <filename unknown>:0
at System.Windows.Forms.X11Keyboard..ctor (IntPtr display, IntPtr clientWindow) [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUIX11.SetDisplay (IntPtr display_handle) [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUIX11..ctor () [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUIX11.GetInstance () [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUI..cctor () [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Windows.Forms.Application.EnableVisualStyles () [0x00000] in <filename unknown>:0
at KeePass.Program.Main (System.String] args) [0x00000] in <filename unknown>:0
普通用户用 sudo 执行 KeePass 的报错:
> sudo mono /usr/lib/keepass/KeePass.exe
Unhandled Exception:
System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.XplatUI ---> System.ArgumentNullException: Could not open display (X-Server required. Check you DISPLAY environment variable)
Parameter name: Display
at System.Windows.Forms.XplatUIX11.SetDisplay (IntPtr display_handle) [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUIX11..ctor () [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUIX11.GetInstance () [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUI..cctor () [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Windows.Forms.Application.EnableVisualStyles () [0x00000] in <filename unknown>:0
at KeePass.Program.Main (System.String] args) [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.XplatUI ---> System.ArgumentNullException: Could not open display (X-Server required. Check you DISPLAY environment variable)
Parameter name: Display
at System.Windows.Forms.XplatUIX11.SetDisplay (IntPtr display_handle) [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUIX11..ctor () [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUIX11.GetInstance () [0x00000] in <filename unknown>:0
at System.Windows.Forms.XplatUI..cctor () [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Windows.Forms.Application.EnableVisualStyles () [0x00000] in <filename unknown>:0
at KeePass.Program.Main (System.String] args) [0x00000] in <filename unknown>:0
但是 DISPLAY 变量是没有问题的, 和 root 用户的一样:
> echo $DISPLAY
:0
初步猜测可能是 openSUSE 的配置不当导致这个报错, 因为 root 可以正常执行, 不太可能是 mono 或者 KeePass 有问题.