我有一场噩梦。我无法使用当前版本的 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 ++但是恶心。
答案 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并删除扩展名。所以它看起来像:
然后你的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/这应该可以帮到您。