C# 如何制作;mkbundle--deps“;使用mono 3.2.3的选项

C# 如何制作;mkbundle--deps“;使用mono 3.2.3的选项,c#,mono,mkbundle,C#,Mono,Mkbundle,我正在尝试将mono 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_CON

我正在尝试将mono 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位版本的Windows7和我在官方网站上找到的Cygwin。该代码在Xamarin Studio 4.2和Visual Studio 2010上编译和测试。

cygwin+mingw上如何使用mkbundle 使用mono 4.0.3测试
在mono 4.0.3中,mkbundle可以工作,但要让它工作起来可能很困难。
首先,检查您的设置:

  • 在不包含空格的路径中安装Mono/GTK#(即不是程序文件)
  • 设置一个MinGw/Cygwin工作编译链(as)
  • 为mkbundle定义必需的环境变量
    • mingw编译器位置应在Windows路径中(由cmd使用)
    • pkg config也应位于Windows路径中
  • 使用以下cygwin脚本(它可以调整为在cmd上运行)
然后您可以运行:

mkbundle --deps --keeptemp my.exe my.dll -o bundled.exe
注意事项: -复制应用程序目录中的
mono-2.0.dll
,因为它应该沿着捆绑的exe进行分发

  • 如果使用了
    -z
    ,则还应复制zlib1.dll。(请注意,gcc调用也会发生变化)。您可能需要更多的dll,具体取决于您对框架功能的使用情况(并非详尽的列表:libglib*.dll、libgmodule*.dll、libgthread*.dll、iconv.dll、intl.dll)
  • -c
    仅用于生成存根
  • 您必须指定捆绑包所需的所有exe和dll
  • --keeptemp
    将保留temp.c和temp.s,如果mkbundle在gcc调用时失败,它们可能会派上用场
  • 如果您想手动调用gcc(可能需要):
用于控制台应用程序 要使控制台应用程序正常工作,必须从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#console应用程序() 因此,它可以根据您的需要轻松地修改和重新编译。 阅读代码也有助于理解代码的底层工作原理。

cmd用法,因为mkbundle使用的不同命令都是硬编码的,因此它会从一些参数化增强中受益。

有同样的问题,希望这会引起更多的注意。您可以检查此线程是否有用。。。不幸的是没有。从2013年9月起,Cygwin不再支持MinGW编译器(-gcc MinGW包已删除)。这也是为什么现在有这么多人对mkbundle有这么多问题的原因
cp ${M_PREFIX}/bin/mono-2.0.dll .
i686-pc-mingw32-gcc -U _WIN32 -g -o output.exe -Wall temp.c $(pkg-config --cflags --libs mono-2)  temp.o

    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