Программа C # не работает под моно в Linux. - PullRequest
0 голосов
/ 31 декабря 2011

Я пытаюсь заставить мою программу, написанную на Visual C # 2010, работать на Linux.Для этого я использовал функцию mkbundle, поэтому потенциальному клиенту не нужно устанавливать моно.К сожалению, я не разбираюсь в Linux или Mono, поэтому я просто следовал этому: c # cywgwin mono mkbundle windows 7 - не могу скомпилировать файл

Но по какой-то причине mkbundle пишет [FAIL] вконец, говоря что-то о "Нет такого файла или каталога".Я вставил полный текст ниже.Кто-нибудь знает, как решить эту проблему?

$ mkbundle -o MyProgram MyProgram.exe --deps
OS is: Windows
Sources: 1 Auto-dependencies: True
   embedding: C:\cygwin\home\Synaps\MyProgram.exe
   embedding: C:\Mono-2.10.8\lib\mono\4.0\mscorlib.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\System.Drawing.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\System.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\Mono.Security.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\System.Configuration.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\System.Xml.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\System.Security.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\System.Windows.Forms.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\Accessibility.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\Mono.WebBrowser.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\Mono.Posix.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\System.Data.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\Mono.Data.Tds.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\System.Transactions.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\System.EnterpriseServices.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\AForge.Imaging.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\AForge.dll
   embedding: C:\Mono-2.10.8\lib\mono\4.0\AForge.Math.dll
Compiling:
as -o temp.o temp.s
gcc -mno-cygwin -g -o MyProgram -Wall temp.c `pkg-config --cflags --libs mono-2|d
os2unix`  temp.o
: No such file or directory
temp.c: In function `main':
temp.c:143: warning: implicit declaration of function `g_utf16_to_utf8'
temp.c:143: warning: assignment makes pointer from integer without a cast
temp.c:158: warning: assignment makes pointer from integer without a cast
[Fail]

Когда я пытался использовать mkbundle на виртуальной машине Linux, я успешно получал исполняемый файл Linux, но получал следующую ошибку, когда запускаю программу под Ubuntu Linux VM (Oracle VM Virtual Box):

Unhandled Exception: System.ArgumentException: A null reference or invalid value was found [GDI+ status: InvalidParameter]
  at System.Drawing.GDIPlus.CheckStatus (Status status) [0x00000] in <filename unknown>:0 
  at System.Drawing.Bitmap.SetResolution (Single xDpi, Single yDpi) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Drawing.Bitmap:SetResolution (single,single)
  at AForge.Imaging.ColorReduction.ColorImageQuantizer.ReduceColors (System.Drawing.Bitmap image, Int32 paletteSize) [0x00000] in <filename unknown>:0 
  at FootMeasure.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentException: A null reference or invalid value was found [GDI+ status: InvalidParameter]
  at System.Drawing.GDIPlus.CheckStatus (Status status) [0x00000] in <filename unknown>:0 
  at System.Drawing.Bitmap.SetResolution (Single xDpi, Single yDpi) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Drawing.Bitmap:SetResolution (single,single)
  at AForge.Imaging.ColorReduction.ColorImageQuantizer.ReduceColors (System.Drawing.Bitmap image, Int32 paletteSize) [0x00000] in <filename unknown>:0 
  at FootMeasure.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0 

1 Ответ

5 голосов
/ 03 января 2012

Как я сказал в комментарии, если вы хотите создать самодостаточный исполняемый двоичный файл Linux , вы не должны использовать mkbundle в Windows. Вы должны запустить mkbundle в Linux , чтобы получить исполняемый файл Linux (и вам, вероятно, следует позаботиться о Linux-X86 в 32 битах и ​​Linux-x86-64 в 64 битах, которые отличаются).

Я предлагаю вам скомпилировать и запустить ваше приложение в коробке Linux (вы можете даже установить систему Linux внутри виртуальной машины, если хотите). Таким образом, самый простой способ - установить дистрибутив Linux (например, Debian) на вашем компьютере.

Я не думаю, что вы легко найдете кросс-компилятор , способный скомпилировать на компьютере Windows программу Mono , предназначенную для Linux.

И то, что вы делаете (запускаете mkbundle в Windows), производит исполняемый файл Windows (для Cygwin), он не может дать вам двоичный исполняемый файл Linux, какой бы вариант вы ни пытались.

...