如何在Linux上捆绑Mono / GTK#应用程序?

时间:2015-07-26 00:25:02

标签: linux mono gtk gtk# mkbundle

以下是我遇到的问题:我使用MonoDevelop编写了一个Gtk#程序,它运行得很好。但现在我希望能够在其他Linux机器上运行它,而无需安装MonoDevelop。

我的解决方案有两个项目:主要的Gtk#应用程序,以及它所依赖的C#库项目。因此,当我构建主项目时,它会生成MainProject.exe和MainProject.exe.mdb,以及bin / Release文件夹中的DependencyProject.dll。

我尝试运行以下命令将其全部打包成一个可执行文件(从bin / Release文件夹运行):

mkbundle MainProject.exe -o mainproject --deps *.dll

但是,我在运行该命令时遇到此错误:

  

未处理的例外:

     

System.IO.FileNotFoundException:无法加载文件或程序集> -kk-sharp'或其中一个依赖项。系统找不到指定的文件。

     

文件名:' gtk-sharp'

     

在System.AppDomain.Load(System.String assemblyString,System.Security.Policy.Evidence assemblySecurity,Boolean refonly)[0x00000] in:0

     

at(wrapper remoting-invoke-with-check)System.AppDomain:Load(string,System.Security.Policy.Evidence,bool)

     

在System.Reflection.Assembly.ReflectionOnlyLoad(System.String assemblyString)[0x00000] in:0

     

在IKVM.Reflection.Universe.DefaultResolver(System.String refname,Boolean throwOnError)[0x00000] in:0

     

在IKVM.Reflection.Universe.Load(System.String refname,IKVM.Reflection.Module requesModule,Boolean throwOnError)[0x00000] in:0

     

在IKVM.Reflection.Universe.Load(System.String refname)[0x00000] in:0

     

在MakeBundle.QueueAssembly(System.Collections.Generic.List`1文件,System.String代码库)[0x00000]中:0

     

[错误]致命的未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集> -kk-sharp'或其中一个依赖项。系统找不到指定的文件。

     

文件名:' gtk-sharp'

     

在System.AppDomain.Load(System.String assemblyString,System.Security.Policy.Evidence assemblySecurity,Boolean refonly)[0x00000] in:0

     

at(wrapper remoting-invoke-with-check)System.AppDomain:Load(string,System.Security.Policy.Evidence,bool)

     

在System.Reflection.Assembly.ReflectionOnlyLoad(System.String assemblyString)[0x00000] in:0

     

在IKVM.Reflection.Universe.DefaultResolver(System.String refname,Boolean throwOnError)[0x00000] in:0

     

在IKVM.Reflection.Universe.Load(System.String refname,IKVM.Reflection.Module requesModule,Boolean throwOnError)[0x00000] in:0

     

在IKVM.Reflection.Universe.Load(System.String refname)[0x00000] in:0

     

在MakeBundle.QueueAssembly(System.Collections.Generic.List`1文件,System.String代码库)[0x00000]中:0

我看到了其他一些类似问题的Stack Overflow问题,但没有一个提供任何实用的解决方案。如何有效地使用此mkbundle命令?

1 个答案:

答案 0 :(得分:1)

mkbundle非常棒,如果你想要一个完全独立的应用程序,它不依赖单声道或与单声道相关的任何东西安装在目标机器上。

但是,在mono pages中,您可以读到: "生成的可执行文件是自包含的,不需要安装Mono运行时即可运行。但是,如果您的应用程序依赖于由单声道运行时或Gtk#链接的库,则需要安装这些库(Gtk #helper库)。"

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

如果要部署到Windows,则可以在应用程序中包含GTK# installer(.NET可能已经存在)。如果要部署到linux或mac,则需要在应用运行之前安装 mono 软件包(不一定是mono-complete)。

希望这有帮助。