2013-03-26 67 views
1

我发现自己无法在Mono 3.0(OpenSUSE 12.3 x64)上运行任何WinForms应用程序。我得到的问题是System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.XplatUI ---> System.TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.GDIPlus ---> System.DllNotFoundException: /usr/local/lib/libgdiplus.so。它找不到libgdiplus.so的原因是它不在我的系统中的/usr/local/lib中,而是/usr/lib64。我知道/usr/lib64在ldconfig的路径中,我也尝试将/etc/mono/config中的gdiplus的dllmap条目更改为直接指向它,并且错误仍然存​​在。Mono DllNotFound错误

我有一个试图运行MoMA的完整日志MONO_LOG_LEVEL="debug"here.它似乎忽略了配置文件并直接在错误的地方寻找SO。

有没有什么办法让它在正确的地方找到这个SO?

+0

您的应用程序是64位还是32位应用程序? – 2013-03-26 01:58:12

+0

我假设你已经运行'ldconfig -v'来更新库?它还应该打印出路径,以便确认命中'/ usr/lib64'。 – 2013-03-26 02:13:14

+0

@ chue-x是的,我运行ldconfig并且'/ usr/lib64'在列表中。另外,libgdiplus.so特别在ldconfig的库列表中。 @Timo都不是 - 它是.NET字节码,可以在任何具有Mono或.NET Framework的平台上运行。 – PrinceBilliard 2013-03-26 14:04:53

回答

3

@PrinceBilliard - 根本原因是对/data/config.in的更改,它将(部分)硬编码路径添加到libgdiplus.so。真正的修复方法是修改源代码以从条目中删除路径,在条目中仅保留libgdiplus.so
如果在配置文件中有路径,Mono将使用该路径并忽略ldconfig缓存和LD_LIBRARY_PATH。如果没有路径,Mono将尝试使用不同后缀的库名称以及引用ldconfig缓存和LD_LIBRARY_PATH。

我在包规范中处理它的方式是添加%post任务来编辑/ mono/config并从条目中删除路径。 RobFlum