Попытка запустить моно-программу, но отсутствует исключение libgdiplus - PullRequest
1 голос
/ 08 ноября 2010

В настоящее время я пытаюсь заставить мою программу на C # работать в Linux.Используя моно на моем компьютере с Linux, программа работает нормально.Так что я использовал mkbundle и все это скомпилировано и так правильно.Но когда я пытаюсь запустить прилагаемую программу на любом другом компьютере с Linux, я получаю эту ошибку:

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: libgdiplus.so.0

Я использовал команду mkbundle:

mkbundle --static program.exe --deps -o a.out

Я также попытался использовать mkbundle2без удачи.

Я подумал, что, возможно, есть способ специально включить библиотеки с помощью mkbundle (например, указать, где найти libgdiplus).Он должен быть связан, когда я использую mkbundle, но я предполагаю, что это не потому, что когда я запускаю свою программу на любом другом компьютере с Linux (который не работает в режиме mono), я получаю эту ошибку.

Обе машиныпод управлением Ubuntu 10.10 AMD64.

Ответы [ 3 ]

6 голосов
/ 24 декабря 2012

Файл конфигурации mono 3.0 для windos содержит неверные записи для ссылок libgdiplus.

Измените две строки файла C: \ Program Files (x86) \ Mono-3.0.2 \ etc \ mono \ config следующим образом:

 <dllmap dll="gdiplus" target="/tmp/install/lib/libgdiplus.so" os="!windows"/>
 <dllmap dll="gdiplus.dll" target="/tmp/install/lib/libgdiplus.so" os="!windows"/>
2 голосов
/ 08 ноября 2010

Внешние вспомогательные библиотеки не включены в исполняемый файл, поэтому вам нужно будет либо распространять libgdiplus, либо использовать опцию -oo для создания объектного файла, который вы будете связывать в программе вместе с необходимыми библиотеками. Конечно, вам также нужно добавить запись dllmap на карту, например, из libgdiplus в __Internal.

Обратите внимание: если вы просто распространяете программу, сгенерированную mkbundle, как есть, вы нарушаете лицензию mono на бесплатное программное обеспечение, поэтому, если, например, у вас нет специальной лицензии от Novell, или вы программируете свободное программное обеспечение или вы также распространяете объектные файлы приложения, чтобы люди могли связать себя, вы не должны использовать mkbundle.

0 голосов
/ 05 апреля 2011

Если на вашей «чужой» машине вы запустите это:

ldd a.out

Вы должны увидеть, какие общие библиотеки ожидают. Вам может потребоваться распространять libgdiplus.so с вашей программой или, возможно, статически ссылаться в libgdiplus.a

...