MonoMkbundle是否制作Native代码Mono生成的普通EXE在IL中。我想生成本机可执行文件,使用mkbundle生成本机Exe还是应该使用MonoAOT。是的,mkbundle生成本机可执行文件。例如,在Linux上,这是我的.NET程序集:文件Agent.exeAgent.exe:PE32executable(console)Intel80386,Mono/.Netassembly,forMSWindows我告诉mkbundle将其编译为本机可执行文件(这里我必须添加Common.dll,它是我的Agent.exe程序集的依赖项):mkbundle--deps-oAgentAgent.exeCommon.dll操作系统是:Linux来源:3自动依赖项:True嵌入:Agent/bin/Debug/Agent.exe嵌入:Agent/bin/Debug/Common.dll嵌入:/usr/lib/mono/4.5/mscorlib.dll嵌入:/usr/lib/mono/gac/System.Runtime.Serialization/4.0。0.0__b77a5c561934e089/System.Runtime.Serialization.dll嵌入:/usr/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll嵌入:/usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll嵌入式:/usr/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll嵌入式:/usr/lib/mono/gac/System.Configuration/4.0。0.0__b03f5f7f11d50a3a/System.Configuration.dll嵌入式:/usr/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll嵌入式:/usr/lib/mono/gac/System.Core/4.0。0.0__b77a5c561934e089/System.Core.dll嵌入式:/usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll嵌入式:/usr/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll嵌入:/usr/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll嵌入:/usr/lib/mono/gac/Mono.Data.Tds/4.0.0.0__0738eb9f132ed756/Mono.Data.Tds.dll嵌入式:/usr/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll嵌入式:/usr/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll编译:as-otemp.otemp.scc-ggdb-oAgent-Walltemp.c`pkg-config--cflags--libsmono-2`temp.ocomplete现在,让我们再次运行文件命令,这次针对生成的“代理”二进制文件:文件代理代理:ELF64位LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),对于GNU/Linux2.6.32,BuildID[sha1]=698384c13208eccc609e5a573deeb09ed3420a29,未剥离注意:此本机二进制文件仍然依赖于libmono(Mono运行时库),因此如果没有可用的Mono安装,它将不会打开电脑但是,您可以将libmono嵌入到二进制文件中,并使用mkbundle--static选项来获得独立的、自包含的可执行文件。mkbundle生成一个可执行程序,其中包含命令行中列出的程序集的静态副本。我怀疑这就是您对“本机exe”一词的期望。这是一个小实验:Test01.csusingSystem;公共类Test01{publicstaticvoidMain(){Console.WriteLine("Hello,world!");Console.WriteLine("你好,世界!");Console.WriteLine("你好,世界!");}}输出MSIL应包含三对ldstr和call指令,以及一个终止ret指令。它们的操作码是0x72、0x28和0x2a:让我们检查一下十六进制转储(grep-P允许我们使用非贪婪匹配*?)grep-o-P72.*?28.*?2a...7201000070280100000a7201000070280100000a7201000070280100000a2a现在我们知道对应上面的Test01。cs的MSIL字节序列。mkbundle的输出包含完全相同的字节序列:$mkbundle-oTest01Test01.exe--deps...$od-tx1-w9999999Test01|fgrep-o'7201000070280100000a7201000070280100000a7201000070280100000a2a'7201000070280100002070280100000a08000000002a不幸的是我不认为mkbundle(1)有像--full-aot这样的选项。所以AOT和creatinga(static)bundleexeismutuallyexclusiveasofnow(Mono4.2.2.30)以上是C#学习教程:DoesMonoMkbundlemakenativecode分享的全部内容,如果对大家有用需要了解更多关于C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
