我在Visual Studio 2010的C#.Net中开发了一个使用WinForm的testing应用程序。现在,我想在Linux下使用Mono在CentOS上运行这个应用程序。 所以我尝试了下面的命令序列 –
[root@localhost TestLinux]# /usr/bin/mono ./Test.exe
我遇到了一个例外
Unhandled Exception: 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: gdiplus.dll at (wrapper managed-to-native) System.Drawing.GDIPlus:GdiplusStartup (ulong&,System.Drawing.GdiplusStartupInput&,System.Drawing.GdiplusStartupOutput&) at System.Drawing.GDIPlus..cctor () [0x00000] --- End of inner exception stack trace --- at <0x00000> <unknown method> at System.Drawing.Graphics.FromHdcInternal (IntPtr hdc) [0x00000] at System.Windows.Forms.XplatUIX11.SetDisplay (IntPtr display_handle) [0x00000] at System.Windows.Forms.XplatUIX11..ctor () [0x00000] at System.Windows.Forms.XplatUIX11.GetInstance () [0x00000] at System.Windows.Forms.XplatUI..cctor () [0x00000] --- End of inner exception stack trace --- at <0x00000> <unknown method> at System.Windows.Forms.Application.EnableVisualStyles () [0x00000] at Test.Program.Main () [0x00000]
在做一些研究的同时,我发现这是由于linux上的gdiplus.dll及其计数器部分libgdiplus.so.0之间的链接所致,需要将其条目放在ldconfigcaching中。
[root@localhost TestLinux]# ldconfig -p | grep libgdiplus libgdiplus.so.0 (libc6) => /usr/lib/libgdiplus.so.0
输出清楚地显示libgdiplus.so.0在ldconfigcaching中,但仍然不能正常工作。 我也尝试在应用程序configuration中添加DllMap条目,如下所示
<?xml version="1.0"?> <configuration> <startup> <supportedRuntime version="v2.0.50727"/> </startup> <dllmap dll="gdiplus.dll" target="libgdiplus.so.0"/> </configuration>
请让我知道是否有人偶然发现过去。
你已经追查错误了。 您的单声道版本不支持EnableVisualStyles。 升级到支持它的版本(据我所知它是> = 2.9),或者尝试在你的.net应用程序中禁用这个功能,这将导致“不那么好的UI元素”。 对我来说,它工作,因为我正在研究gentoo。 突然之间,我的单声道应用程序出现后,不再崩溃。
另外请确保libgdiplus.so.0实际上已安装,并且在路径中,默认情况下不在mono中。 但是,是的,最重要的是CentOS默认有一个过时的单声道版本。