在 CentOS 或 Linux 上使用 Mono 执行 .Net 应用程序

本文关键字:Mono 执行 Net 应用程序 CentOS Linux | 更新日期: 2023-09-27 18:37:00

我在Visual Studio 2010上使用C# .Net中的WinForm开发了一个测试应用程序。现在,我想在 Linux 下使用 CentOS 上的 Mono 运行它。所以我尝试了以下命令序列 -

[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] 

在做一些研究时,我发现这是由于 gdiplus .dll 和 linux 上的对应部分 libgdiplus.so.0 之间的链接,需要将其条目放在 ldconfig 缓存中。

[root@localhost TestLinux]# ldconfig -p | grep libgdiplus
    libgdiplus.so.0 (libc6) => /usr/lib/libgdiplus.so.0

输出清楚地表明libgdiplus.so.0在ldconfig缓存中,但程序仍然无法正常工作。我还尝试在应用程序配置中添加 DllMap 条目,如下所示

<?xml version="1.0"?>
<configuration>
<startup>
  <supportedRuntime version="v2.0.50727"/>
</startup>  
    <dllmap dll="gdiplus.dll" target="libgdiplus.so.0"/>  
</configuration>

如果过去有人偶然发现这一点,请告诉我。

在 CentOS 或 Linux 上使用 Mono 执行 .Net 应用程序

您错误地跟踪了错误。您的单声道版本不支持启用视觉样式。升级到支持它的版本(据我所知是>= 2.9 )或尝试在您的 .net 应用程序中禁用此功能,这将导致"不太好的 UI 元素"。对我来说,它奏效了,因为我正在研究gentoo。突然,在出现之后,我的单声道应用程序不再崩溃了。

还要确保libgdiplus.so.0实际上已安装并且在路径上,默认情况下它不是单声道。 但是,是的,最主要的是 CentOS 默认带有过时的单声道版本。