我试图使用mkbundle,这样我就可以分发一个GTK#应用程序,而不需要用户安装.NET/Mono或GTK#。我已经成功地捆绑了一个使用winforms的应用程序,但由于某种原因,当我对GTK#应用程序进行同样的处理时,它将无法工作。
这就是我从cygwin那里得到的东西:
$ mkbundle --deps a.exe OS is: Windows Sources: 1 Auto-dependencies: True
未处理的异常: System.IO.FileNotFoundException:无法加载文件或程序集“gtk”或其依赖项之一。系统找不到指定的文件。
文件名:“gtk-sharp”
在System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef,System.Security.Policy.Evidence assemblySecurity) 0x00000 in :0
at (包装器远程-调用-与-检查) System.AppDomain:Load (System.Reflection.AssemblyName,System.Security.Policy.Evidence)
在System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) 0x00000 in :0
at (包装器远程-调用-与-检查) System.AppDomain:Load (System.Reflection.AssemblyName)
在System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) 0x00000 in :0
在MakeBundle.QueueAssembly (System.Collections.ArrayList文件,System.String代码基) 0x00000 in :0
在MakeBundle.Main (System.String[] args) 0x00000 in :0
错误致命的未处理异常: System.IO.FileNotFoundException:无法加载文件或程序集“gtk”或其依赖项之一。系统找不到指定的文件。
文件名:“gtk-sharp”
在System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef,System.Security.Policy.Evidence assemblySecurity) 0x00000 in :0
at (包装器远程-调用-与-检查) System.AppDomain:Load (System.Reflection.AssemblyName,System.Security.Policy.Evidence)
在System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) 0x00000 in :0
at (包装器远程-调用-与-检查) System.AppDomain:Load (System.Reflection.AssemblyName)
在System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) 0x00000 in :0
在MakeBundle.QueueAssembly (System.Collections.ArrayList文件,System.String代码基) 0x00000 in :0
在MakeBundle.Main (System.String[] args) 0x00000 in :0
但是,我的PATH变量中有/cygdrive/c/GtkSharp/2.12/lib。如果我在cygwin中键入"gtk-sharp.dll“,我可以检查它,然后返回以下内容:
$ gtk-sharp.dll bash: /cygdrive/c/GtkSharp/2.12/lib/gtk-sharp-2.0/gtk-sharp.dll: cannot execute binary file
所以它应该能够找到文件!
任何帮助都将不胜感激。
发布于 2013-05-15 03:23:27
我找到了一个shell脚本来完成所有这些工作,并将其修改为最新版本,到2013年5月,您只需按如下方式使用该脚本:
https://gist.github.com/tebjan/5581296
1.)安装cygwin并确保您选择以下软件包:- gcc-mingw - pkg-config - mingw-zlib1 - mingw-zlib-devel
2.)安装Mono发布包:“、Gtk#和XSP”
3.)下载脚本,把它放在应用程序之外,并修改它以适应您的环境(仔细阅读文件中的注释)。
4.)打开cygwin并导航到您的应用程序的输出文件夹,在该文件夹中存在ececutable和bin,例如YourProject/bin/Release
5.)使用命令./mkbundle_cygwin.sh执行脚本
故障排除:如果捆绑的可执行文件不能工作,请确保原始的.NET应用程序在mono上工作。您可以通过调用mono.exe并将您的.NET应用程序传递给它,或者通过安装XamarinStudio并从那里运行您的项目来测试它(让您将mono设置为运行时)。
发布于 2011-09-06 16:09:55
好的,我不知道这是否是一个真正的解决方案,但我只是将程序集从C:\GtkSharp\2.12\lib\gtk-Shar-2.0复制到C:\Mono-2.10.5\lib\mono\4.0,现在似乎使用以下步骤绑定OK:
mkbundle -c -o host.c -oo bundle.o --deps app.exe
nano host.c
更改以下内容:
#ifdef _WIN32
#include <windows.h>
#endif`至
#ifdef _WIN32
#include <windows.h>
#endif
#undef _WIN32最后:
gcc -mno-cygwin -o bundled.exe -Wall host.c `pkg-config --cflags --libs mono-2|dos2unix` bundle.o对我起作用了。虽然我还需要将machine.config从C:\Mono-2.10.5\etc\mono\4.0复制到我的应用程序所在的目录中,并将-机器配置- machine.config传递给mkbundle。
https://stackoverflow.com/questions/7308044
复制相似问题