2013-10-25 5 views
5

Ho sviluppato un'applicazione di test utilizzando WinForm in C# .Net su Visual Studio 2010. Ora, voglio eseguire questo sotto Linux utilizzando Mono su CentOS. Così ho provato sotto sequenza di comandi -Esecuzione dell'applicazione .Net utilizzando Mono su CentOS o Linux

[[email protected] TestLinux]# /usr/bin/mono ./Test.exe 

ho colpito un'eccezione

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] 

Mentre facendo alcune ricerche ho scoperto che questo è dovuto al collegamento tra gdiplus.dll e il suo contatore parte libgdiplus.so.0 su Linux, è necessario inserire la sua voce nella cache di ldconfig.

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

L'output mostra chiaramente che libgdiplus.so.0 c'è nella cache ldconfig ma il programma non funziona. Ho anche cercato di aggiungere la voce DllMap nella configurazione delle applicazioni, come di seguito

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

prega fatemi sapere se qualcuno inciampato su questo in passato.

+0

Perché usi WinForm? WinForm non è completamente implementato in mono. Anche le applicazioni GTK # hanno un aspetto più nativo su Linux. – Deffiss

risposta

3

Hai rilevato l'errore sbagliato. La tua versione mono non supporta EnableVisualStyles. Aggiornamento a una versione, che lo supporta (per quanto mi ricordo è> = 2.9) o provare a disabilitare questa funzione nella tua applicazione .net, che risulterà in "non così belli elementi dell'interfaccia utente". Per me ha funzionato, dato che stavo lavorando su gentoo. All'improvviso, dopo un emerge, la mia applicazione mono non si è più arrestata.

1

Accertati anche che libgdiplus.so.0 sia effettivamente installato e sul percorso, non è di default in mono. Ma sì, la cosa principale è che CentOS viene fornito con una versione obsoleta di mono per impostazione predefinita.