0

我正在尝试使用 mkbundle,这样我就可以分发 GTK# 应用程序,而无需用户安装 .NET/Mono 或 GTK#。我已经成功地捆绑了一个使用 winforms 的应用程序,但由于某种原因,当我对 GTK# 应用程序执行相同操作时,它就不起作用了。

这就是我从 cygwin 中得到的:

$ mkbundle --deps a.exe OS is: Windows Sources: 1 Auto-dependencies: True

未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集“gtk-sharp”或其依赖项之一。该系统找不到指定的文件。 文件名: System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) [0x00000] 处
的 'gtk-sharp'在 (wrapper remoting-invoke-with-check) System. AppDomain:Load (System.Reflection.AssemblyName,System.Security.Policy.Evidence) at System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in :0 at (wrapper remoting-invoke-with-check) 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] 在:0
在 MakeBundle.Main(System.String[] args)[0x00000] 在:0
[错误] 致命的未处理异常:系统。 IO.FileNotFoundException:无法加载文件或程序集“gtk-sharp”或其依赖项之一。该系统找不到指定的文件。 文件名: System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) [0x00000] 处
的 'gtk-sharp'在 (wrapper remoting-invoke-with-check) System. AppDomain:Load (System.Reflection.AssemblyName,System.Security.Policy.Evidence) 在 System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in :0



在 (wrapper remoting-invoke-with-check) System.AppDomain:Load (System.Reflection.AssemblyName)
at System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in :0
at MakeBundle.QueueAssembly ( System.Collections.ArrayList 文件,System.String 代码库)[0x00000] in :0
at 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

所以它应该能够找到文件!

任何帮助将非常感激。

4

2 回答 2

1

好的,我不知道这是否是一个真正的解决方案,但我只是将程序集从 C:\GtkSharp\2.12\lib\gtk-sharp-2.0 复制到 C:\Mono-2.10.5\lib\mono\4.0 和现在似乎可以使用以下步骤捆绑:

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 machine.config 传递给 mkbundle。

于 2011-09-06T16:09:55.467 回答
1

我找到了一个执行所有这些操作的 shell 脚本并将其修改为最新版本,截至 2013 年 5 月,您可以按如下方式使用该脚本:

https://gist.github.com/tebjan/5581296

1.) 安装 cygwin 并确保选择以下软件包: - gcc-mingw - pkg-config - mingw-zlib1 - mingw-zlib-devel

2.) 安装 Mono 发行包:“Mono for Windows, Gtk#, and XSP”

3.) 下载脚本,将其放在您的应用程序旁边并修改它以适应您的环境(仔细阅读文件中的注释)。

4.)打开cygwin并导航到ececutable和scipt所在的应用程序的输出文件夹,例如YourProject/bin/Release

5.) 使用以下命令执行脚本:./mkbundle_cygwin.sh

故障排除:如果捆绑的可执行文件无法运行,请确保原始 .NET 应用程序在单声道上运行。您可以通过调用 mono.exe 并将您的 .NET 应用程序传递给它或通过安装 XamarinStudio 并从那里运行您的项目来测试它(让您将 mono 设置为运行时)。

于 2013-05-15T03:23:27.483 回答