Создать исполняемый файл C# с mkbundle на окнах

Я пытаюсь создать исполняемый файл из консольного приложения. Я установил mono,cygwin (mingw-gcc, mingw-zlib1, mingw-zlib-devel, pkg-config) и добавил следующие строки в мой файл.bashrc

export PKG_CONFIG_PATH=/cygdrive/c/progra~1/Mono-3.2.3/lib/pkgconfig
export PATH=$PATH:/cygdrive/c/progra~1/Mono-3.2.3/bin
export CC="i686-pc-mingw32-gcc -U _WIN32"

Но каждый раз, когда я пытаюсь использовать mkbundle, я получаю следующее сообщение

Есть ли способ заставить mkbundle правильно работать на windows.?

(Я использую windows 7 x86, mono 3.2.3, cygwin, который я нашел на официальном сайте, xamarin studio 4.2 и net framwork 4)

3 ответа

Эта проблема все еще представлена ​​в текущей моно версии под Windows. Это произошло из-за того, что моно команда переключила GC по умолчанию на SGEN. Поэтому, когда вы пытаетесь использовать mkbundle, как вы видите в своей ошибке, утилита mkbundle пытается найти библиотеку mono-2, но эта библиотека не была включена в установку, и у вас произошел сбой. Чтобы решить эту проблему, вы должны настроить mkbundle на использование libmonosgen-2.0 вместо mono-2. Давайте попробуем сделать это.

Ключевым моментом является установка этой переменной:

export PKG_CONFIG_PATH=/cygdrive/c/progra~1/Mono-3.2.3/lib/pkgconfig

Если вы зайдете в этот каталог, вы увидите много файлов *.pc (конфигурация пакета). Эти файлы отвечают за настройку компоновки библиотек в процессе компоновки. По некоторым причинам моно-команда жестко запрограммировала файл конфигурации пакета и библиотеку для моно-2 (см. Эту строку 492). Как мы можем это исправить, не перестраивая mkbundle? Решение состоит в том, чтобы использовать следующий пакетный скрипт:

# Mono paths
mono_version="3.2.3"
export MONO=/cygdrive/c/progra~2/Mono-$mono_version
machineconfig=$PROGRAMFILES\\Mono-$mono_version\\etc\\mono\\4.5\\machine.config
export PATH=$PATH:$MONO/bin
export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
# Compiller
export CC="i686-pc-mingw32-gcc -U _WIN32"
# Output file name
output_name=Prog.exe
# Produce stub only, do not compile
mkbundle --deps --machine-config "$machineconfig" -c Program.exe
# Produce helper object file. You may see errors at this step but it's a side effect of this method.
mkbundle --deps --machine-config "$machineconfig" -oo temp.o Program.exe
# Compile. Pay attention where I use monosgen-2 
i686-pc-mingw32-gcc -U _WIN32 -g -o "$output_name" -Wall temp.c `pkg-config --cflags --libs monosgen-2` temp.o
# Copy libmonosgen-2.dll
cp $MONO/bin/libmonosgen-2.0.dll .
# Run
./$output_name

У меня была такая же проблема некоторое время назад и я сделал скрипт для cygwin. Вы можете попробовать это, было бы интересно, если это все еще работает:

скрипт mkbunde cygwin

В скрипте есть объяснения, как настроить среду.

Howto для mkbundle на Cygwin + Mingw

Здесь вы можете найти обновленную информацию о том, как заставить mkbundle работать на Windows


Сначала проверьте ваши настройки:

  • Установите Mono/GTK# по пути, который не содержит пробелов (то есть, не Program Files)
  • Установите рабочую цепочку компиляции MinGw/Cygwin (как для компиляции моно в Windows).
  • Определите обязательные переменные среды для mkbundle:
    • Расположение компилятора mingw должно быть в Windows PATH (используется cmd)
    • pkg-config также должен быть в Windows PATH
  • Используйте скрипт cygwin для определения моно и mingw обязательных переменных.

Тогда вы можете запустить:

mkbundle --deps --keeptemp my.exe my.dll -o bundled.exe

Заметки:

  • копия mono-2.0.dllв каталоге приложения, как это должно быть распространено вдоль прилагаемого exe

  • Вы должны указатьвсе EXE и DLL, которые необходимы для комплекта.

  • --keeptemp сохранит temp.c и temp.s, которые могут пригодиться, если mkbundle потерпит неудачу при вызове gcc.
  • Если вы хотите вызвать gcc вручную (и это может понадобиться):
i686-pc-mingw32-gcc -U _WIN32 -g -o output.exe -Wall temp.c $(pkg-config --cflags --libs mono-2)  temp.o

Любой может улучшить mkbundle

mkbundle - это консольное приложение с открытым исходным кодом на C# ( на mono github), поэтому его можно легко модифицировать и перекомпилировать в зависимости от ваших потребностей. Чтение кода также может помочь понять, как он работает.

Другие вопросы по тегам