难以让mkbundle在Windows

时间:2017-06-11 22:48:08

标签: c# .net mono monodevelop

我有一场噩梦。我无法使用当前版本的 Mono(5.0.1.1) mkbundle Windows 上工作。它安装在:

C:\Program Files (x86)\Mono

我有一个非常简单的控制台应用程序,它使用.net库,使用 Xamarin Studio Community 6.1.2(build 44)制作。它非常简单,应用程序调用库中的函数并接收一个字符串作为回报。然后它将此字符串输出到控制台。

该应用程序已编译为" Mono 5.0.1(Visual)(C:\ Program Files(x86)\ Mono)"在Xamarin。我必须禁用MSBuild引擎才能使其正常工作。我可以确认应用程序按预期在命令行中使用mono运行。

现在我想将它打包,以便它们与单声道运行时环境捆绑在一个简单的可执行文件中,因此不需要mono或.net。这一切都必须是独立的。我还想包含应用程序将使用的其他资源文件,这些文件不是DLL。

所以在经过一番搜索之后,我发现mkbundle似乎勾选了所有方框......

首先我遵循这个: How to make "mkbundle --deps" option working with mono 3.2.3

然后我尝试了这个: https://gist.github.com/tebjan/5581296

然后我试着尽可能地遵循这个: Can not compile simple C# application with mkbundle

似乎没有任何作用D:

据我所知,这些指南/脚本可能已过时,但我甚至无法看到更新的方式(目前使用单声道的大量菜鸟)。例如,以下是我尝试从cmd运行mkbundle时收到的两个错误:

C:\Users\asdf\Documents\Projects\Test\Test\bin\Debug>mkbundle Test.exe --simple -o super.exe
ERROR: The SDK location does not contain a C:\Program Files (x86)\Mono/bin/mono runtime

Unhandled Exception:
System.Exception: Exception of type 'System.Exception' was thrown.
  at MakeBundle.Error (System.String msg, System.Object[] args) [0x00016] in <140d0f6d64494c449b7d56649165e7e4>:0
  at MakeBundle.VerifySdk (System.String path) [0x00052] in <140d0f6d64494c449b7d56649165e7e4>:0
  at MakeBundle.Main (System.String[] args) [0x00bd4] in <140d0f6d64494c449b7d56649165e7e4>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.Exception: Exception of type 'System.Exception' was thrown.
  at MakeBundle.Error (System.String msg, System.Object[] args) [0x00016] in <140d0f6d64494c449b7d56649165e7e4>:0
  at MakeBundle.VerifySdk (System.String path) [0x00052] in <140d0f6d64494c449b7d56649165e7e4>:0
  at MakeBundle.Main (System.String[] args) [0x00bd4] in <140d0f6d64494c449b7d56649165e7e4>:0

C:\Users\asdf\Documents\Projects\Test\Test\bin\Debug>mkbundle --sdk "C:\Program Files (x86)\Mono\bin" Test.exe --deps -o super.exe
ERROR: The SDK location does not contain a C:\Program Files (x86)\Mono\bin/bin/mono runtime

Unhandled Exception:
System.Exception: Exception of type 'System.Exception' was thrown.
  at MakeBundle.Error (System.String msg, System.Object[] args) [0x00016] in <140d0f6d64494c449b7d56649165e7e4>:0
  at MakeBundle.VerifySdk (System.String path) [0x00052] in <140d0f6d64494c449b7d56649165e7e4>:0
  at MakeBundle.Main (System.String[] args) [0x00b88] in <140d0f6d64494c449b7d56649165e7e4>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.Exception: Exception of type 'System.Exception' was thrown.
  at MakeBundle.Error (System.String msg, System.Object[] args) [0x00016] in <140d0f6d64494c449b7d56649165e7e4>:0
  at MakeBundle.VerifySdk (System.String path) [0x00052] in <140d0f6d64494c449b7d56649165e7e4>:0
  at MakeBundle.Main (System.String[] args) [0x00b88] in <140d0f6d64494c449b7d56649165e7e4>:0

这是我从单声道运行的一个例子(虽然我很确定我不应该有任何区别)。

 asdf@DIGGLER /cygdrive/c/Users/asdf/Documents/Projects/ConsoleAppAOTDllTest/Co                                                                                                                                                                                               nsoleAppAOTDllTest/bin/Debug
    $ mkbundle --simple testlib.exe -o super.exe
    ERROR: The SDK location does not contain a C:\Program Files (x86)\Mono/bin/mono runtime

    Unhandled Exception:
    System.Exception: Exception of type 'System.Exception' was thrown.
      at MakeBundle.Error (System.String msg, System.Object[] args) [0x00016] in <140d0f6d64494c449b7d56649165e7e4>:0
      at MakeBundle.VerifySdk (System.String path) [0x00052] in <140d0f6d64494c449b7d56649165e7e4>:0
      at MakeBundle.Main (System.String[] args) [0x00bd4] in <140d0f6d64494c449b7d56649165e7e4>:0
    [ERROR] FATAL UNHANDLED EXCEPTION: System.Exception: Exception of type 'System.Exception' was thrown.
      at MakeBundle.Error (System.String msg, System.Object[] args) [0x00016] in <140d0f6d64494c449b7d56649165e7e4>:0
      at MakeBundle.VerifySdk (System.String path) [0x00052] in <140d0f6d64494c449b7d56649165e7e4>:0
      at MakeBundle.Main (System.String[] args) [0x00bd4] in <140d0f6d64494c449b7d56649165e7e4>:0

有人会非常棒,并向我提供有关如何设置环境的最新指南/演练吗?

提前致谢,如果我错过了一些明显的东西,请随意滥用。 对任何无知事先道歉。我现在已经在这里待了大约12个小时而且我已经失去理智了!

清除有关在Windows平台上使用Mono的任何疑问。我这样做有两个原因。我希望能够将运行时与应用程序捆绑在一起,因为它必须是一个无需安装即可运行的应用程序(双击运行并关闭它完成)。我不认为这在当前的.net中是可能的(我知道.net核心正在玩一些魔法与编译到本机,但它似乎很早)并且我尝试了C ++但是恶心。

1 个答案:

答案 0 :(得分:2)

老实说,我想到这个问题在这里停留了9个月没有回答(同样的问题也存在)。

所以,我最近遇到了同样的问题。我在这里查看了源代码:https://github.com/mono/mono/blob/master/mcs/tools/mkbundle/mkbundle.cs#L536

runtime = Path.Combine (sdk_path, "bin", "mono");
if (!File.Exists (runtime))
    Error ($"The SDK location does not contain a {path}/bin/mono runtime");

所以它正在寻找名为&#34; mono&#34;的文件在您的SDK bin文件夹中。嗯..因为我们在Windows上,我们没有无扩展应用程序吗?所以这是一个问题。解决方法是前往SDK bin文件夹(可能是C:\Program Files (x86)\mono\bin\),并复制mono.exe并删除扩展名。所以它看起来像:

enter image description here

然后你的mkbundle命令将通过第一个障碍。如果你想加入关于这是多么愚蠢的话,我也在这里记录了一个Github问题:https://github.com/mono/mono/issues/7731

现在一旦你超越了这个,你就会遇到下一个问题,那就是获取额外的运行时因此你实际上可以为Linux编译也会失败。我建议您按照本指南进行操作:https://dotnetcoretutorials.com/2018/03/22/bundling-mono-with-a-net-executable-using-mkbundle-on-windows/这应该可以帮到您。