如何使"mkbundle --deps"选项与mono 3.2.3一起使用

Tin*_*nki 28 c# mono mkbundle

我试图将应用程序与单声道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"
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

给出积极的结果:

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
Run Code Online (Sandbox Code Playgroud)

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

Fab*_*Fab 1

cygwin + mingw 上的 mkbundle 指南

使用 mono 4.0.3 进行测试
在 mono 4.0.3 中,mkbundle 可以工作,但要使其工作可能很棘手。
首先,检查您的设置:

  • 在不包含空格的路径中安装 Mono/GTK# (即不是 Program Files)
  • 设置一个MinGw/Cygwin工作编译链(作为在 windows 上编译 mono 的编译链)。
  • 定义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"
Run Code Online (Sandbox Code Playgroud)

然后你可以运行:

mkbundle --deps --keeptemp my.exe my.dll -o bundled.exe
Run Code Online (Sandbox Code Playgroud)

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

cp ${M_PREFIX}/bin/mono-2.0.dll .
Run Code Online (Sandbox Code Playgroud)

  • 如果-z使用,则还应复制 zlib1.dll。(请注意,gcc 调用也会发生变化)。根据您对框架功能的使用,您可能需要更多 dll(并非详尽列表:libglib*.dll、libgmodule*.dll、libgthread*.dll、inov.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
Run Code Online (Sandbox Code Playgroud)

对于控制台应用程序

要使控制台应用程序正常工作,您必须从 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
Run Code Online (Sandbox Code Playgroud)

任何人都可以改进 mkbundle

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