Visual Studio 2010 の C# .Net で WinForm を使用してテスト アプリケーションを開発しました。これを、CentOS で Mono を使用して Linux で実行したいと考えています。だから私は以下のコマンドシーケンスを試しました -
[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 の間のリンクが原因であることがわかりました。そのエントリを 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>
誰かが過去にこれに出くわした場合はお知らせください。