我该如何在Linux上打包一个Mono/GTK#应用程序?

5
这是我遇到的问题:我使用MonoDevelop编写了一个Gtk#程序,运行得非常好。但现在我想在其他Linux系统上运行它,而不必安装MonoDevelop。
我的解决方案有两个项目:主要的Gtk#应用程序和一个C#库项目,它依赖于该项目。因此,当我构建主项目时,它会在bin/Release文件夹中生成MainProject.exe和MainProject.exe.mdb,以及DependencyProject.dll。
我尝试运行以下命令将所有内容打包成单个可执行文件(从bin/Release文件夹中运行):
mkbundle MainProject.exe -o mainproject --deps *.dll

然而,在运行该命令时,我遇到了以下错误:
未处理的异常: System.IO.FileNotFoundException:无法加载文件或程序集'gtk-sharp'或其依赖项之一。系统找不到指定的文件。 文件名:'gtk-sharp' 在System.AppDomain.Load(System.String assemblyString,System.Security.Policy.Evidence assemblySecurity,Boolean refonly)[0x00000]中:0 在(wrapper remoting-invoke-with-check) System.AppDomain:Load (string,System.Security.Policy.Evidence,bool) 在System.Reflection.Assembly.ReflectionOnlyLoad(System.String assemblyString)[0x00000]中:0 在IKVM.Reflection.Universe.DefaultResolver(System.String refname,Boolean throwOnError)[0x00000]中:0 在IKVM.Reflection.Universe.Load(System.String refname,IKVM.Reflection.Module requestingModule,Boolean throwOnError)[0x00000]中:0 在IKVM.Reflection.Universe.Load(System.String refname)[0x00000]中:0 在MakeBundle.QueueAssembly(System.Collections.Generic.List`1 files,System.String codebase)[0x00000]中:0 [ERROR] FATAL UNHANDLED EXCEPTION:System.IO.FileNotFoundException:无法加载文件或程序集“gtk-sharp”或其依赖项之一。系统找不到指定的文件。 文件名:“gtk-sharp” 在System.AppDomain.Load(System.String assemblyString,System.Security.Policy.Evidence assemblySecurity,Boolean refonly)[0x00000]中:0 在(wrapper remoting-invoke-with-check) System.AppDomain:Load (string,System.Security.Policy.Evidence,bool) 在System.Reflection.Assembly.ReflectionOnlyLoad(System.String assemblyString)[0x00000]中:0 在IKVM.Reflection.Universe.DefaultResolver(System.String refname,Boolean throwOnError)[0x00000]中:0 在IKVM.Reflection.Universe.Load(System.String refname,IKVM.Reflection.Module requestingModule,Boolean throwOnError)[0x00000]中:0 在IKVM.Reflection.Universe.Load(System.String refname)[0x00000]中:0 在MakeBundle.QueueAssembly(System.Collections.Generic.List`1 files,System.String codebase)[0x00000]中:0
我看到了一些其他类似的问题,但没有一个提供实际的解决方案。我如何有效使用这个命令呢?

我在虚拟机上的Ubuntu 14上遇到了同样的问题。当我转移到干净的Ubuntu 15安装时,mkbundle完成而没有任何错误。现在我有不同的问题,但会在另一个问题中写出来。 - onedevteam.com
1个回答

1

mkbundle非常棒,如果你想要一个完全独立的应用程序,该应用程序不需要在目标机器上安装任何与mono相关的东西。

然而,在mono页面中,您可以读到: “生成的可执行文件是自包含的,不需要安装Mono运行时即可运行。但是,如果您的应用程序依赖于由mono运行时链接的库或Gtk#,则需要安装这些库(Gtk#辅助库会出现在脑海中)。”

如果您只想从几个dll创建单个可执行文件,则ILRepack是更好的选择。

如果您部署到Windows,则可以将GTK#安装程序与您的应用程序一起包括(.NET可能已经存在)。如果您部署到Linux或Mac,则需要在应用程序运行之前安装mono软件包(不一定是mono-complete)。

希望这有所帮助。


2
我该如何将Mono运行时与GTK#应用程序捆绑在Mac上?这是否可能? - techno
1
我真的不知道。Mac世界对我来说很陌生。 - Baltasarq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接