如何使“mkbundle –deps”选项与mono 3.2.3一起使用

我试图将应用程序与单声道3.2.3捆绑到一个独立的可执行文件。 为此,我遵循本指南。 声明变量后:

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 export CC="i686-pc-mingw32-gcc -U _WIN32" 

mkbundle –deps命令无法本地化引用的程序集:

 Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'gtk-sharp' or one of its dependencies. The system cannot find the file specified. File name: 'gtk-sharp' 

使用mono 2.10.9执行完全相同的操作:

 mono_version="2.10.9" export MONO=/cygdrive/c/progra~2/Mono-$mono_version machineconfig=$PROGRAMFILES\\Mono-$mono_version\\etc\\mono\\4.0\\machine.config export PATH=$PATH:$MONO/bin export PKG_CONFIG_PATH=$MONO/lib/pkgconfig export CC="i686-pc-mingw32-gcc -U _WIN32" mkbundle --deps --machine-config "$machineconfig" -c UI.exe 

给出积极的结果:

 OS is: Windows WARNING: Check that the machine.config file you are bundling doesn't contain sensitive information specific to this machine. Sources: 3 Auto-dependencies: True embedding: C:\users\piotr\desktop\authoringtool\UI\bin\debug\UI.exe config from: C:\users\piotr\desktop\authoringtool\UI\bin\debug\UI.exe.config embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\gac\gtk-sharp\2.12.0.0__35e10195dab3c99f\gtk-sharp.dll embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\gac\glib-sharp\2.12.0.0__35e10195dab3c99f\glib-sharp.dll . . . embedding: C:\PROGRA~2\MONO-2~1.9\lib\mono\4.0\Mono.Posix.dll Machine config from: C:\Program Files (x86)\Mono-2.10.9\etc\mono\4.0\machine.config Compiling: as -o temp.o temp.s 

有谁知道这种行为的原因? 我正在使用64位版本的Windows 7和我在官方网站上找到的Cygwin。 代码在Xamarin Studio 4.2和Visual Studio 2010上编译和测试。

如何在cygwin + mingw上使用mkbundle

用mono 4.0.3测试
在mono 4.0.3中,mkbundle可以正常工作,但要使它工作起来可能会很棘手。
首先,检查您的设置:

  • 不包含空格路径中安装Mono / GTK#(即不是Program Files)
  • 设置一个MinGw / Cygwin工作编译链(作为在Windows上编译单声道的编译链)。
  • 为mkbundle定义必需的环境变量
    • mingw编译器位置应该在Windows PATH中(由cmd使用)
    • pkg-config也应该在Windows PATH中
  • 使用以下cygwin脚本(它可以适用于在cmd上运行)
 # M_PREFIX refers to Mono installation # For more information, search for prefix installation in Mono documentation M_PREFIX='/cygdrive/c/Mono' export DYLD_FALLBACK_LIBRARY_PATH=${M_PREFIX}/lib:${DYLD_FALLBACK_LIBRARY_PATH} export LD_LIBRARY_PATH=${M_PREFIX}/lib:${M_PREFIX}/lib/mono/4.5:${LD_LIBRARY_PATH} export C_INCLUDE_PATH=${M_PREFIX}/include:${C_INCLUDE_PATH} export ACLOCAL_PATH=${M_PREFIX}/share/aclocal:${ACLOCAL_PATH} export PKG_CONFIG_PATH=${M_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH} # Here we added the system32 to make cmd available to mkbundle # /usr/bin is the default location for mingw export PATH=${M_PREFIX}/bin:/cygdrive/c/Windows/system32:/usr/bin:${PATH} export CC="i686-pc-mingw32-gcc -U _WIN32" 

然后你可以运行:

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

注意:在应用程序目录中复制mono-2.0.dll ,因为它应该沿着捆绑的exe分发

 cp ${M_PREFIX}/bin/mono-2.0.dll . 

  • 如果使用-z ,也应该复制zlib1.dll。 (注意gcc调用也会改变)。 你可能需要更多的dll,具体取决于你对框架function的使用(不是详尽的列表:libglib * .dll,libgmodule * .dll,libgthread * .dll,iconv.dll,intl.dll)
  • -c用于仅生成存根。
  • 您必须指定捆绑包所需的所有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 

对于控制台应用

要使控制台应用程序正常工作,必须从gcc命令中删除-mwindows 。 为此,您必须调用pkg-config --cflags --libs mono-2并删除-mwindows

之后您应该获得类似的东西:

 i686-pc-mingw32-gcc -g -o output.exe -Wall temp.c -mms-bitfields -IC:/Mono/include/mono-2.0 -mms-bitfields -LC:/Mono/lib -lmono-2.0 -lws2_32 -lpsapi -lole32 -lwinmm -loleaut32 -l advapi32 -lversion temp.s 

任何人都可以改进mkbundle

mkbundle是一个开源的C#控制台应用程序在mono github上 ),因此可以根据您的需要轻松修改和重新编译。 阅读代码也有助于理解它在底层的工作原理。
cmd用法作为mkbundle使用的不同命令是硬编码的,因此它将受益于一些参数化增强。