Mono Mkbundle是否制作本地代码
单声道生成的正常EXE在IL中。我想生成Native Executable,使用mkbundle生成本机Exe还是应该使用Mono AOT。
是的,mkbundle生成本机可执行文件。 例如,在Linux上,这是我的.NET程序集:
file Agent.exe Agent.exe: PE32 executable (console) Intel 80386, Mono/.Net assembly, for MS Windows
我告诉mkbundle
将其编译为本机可执行文件(这里我必须添加Common.dll,它是我的Agent.exe程序集的依赖项):
mkbundle --deps -o Agent Agent.exe Common.dll 操作系统是:Linux 来源:3自动依赖:真 嵌入: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 -o temp.o temp.s cc -ggdb -o Agent -Wall temp.c`pkg-config --cflags --libs mono-2` temp.o 完成
现在,让我们再次运行file
命令,这次是针对生成的’Agent’二进制文件:
file Agent Agent: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=698384c13208eccc609e5a573deeb09ed3420a29, not stripped
注意:此本机二进制文件仍依赖于libmono(Mono运行时库),因此如果没有可用的Mono安装,它将无法在计算机上运行。
但是,您可以将libmono嵌入到二进制文件中,并使用mkbundle --static
选项获取独立的,自包含的可执行文件。
mkbundle生成一个可执行程序,该程序将包含命令行中列出的程序集的静态副本。
我怀疑这是你对“本地exe”这个词的期望。 这是一个小实验:
Test01.cs
using System; public class Test01 { public static void Main() { Console.WriteLine("Hello, world!"); Console.WriteLine("Hello, world!"); Console.WriteLine("Hello, world!"); } }
输出MSIL应包含三对ldstr
和call
指令,以及终止ret
指令。 它们的操作码分别为0x72,0x28和0x2a:
我们来检查hex转储( grep -P
允许我们使用非贪婪的匹配*?
)
$ od -t x1 -w9999999 Test01.exe | grep -o -P 72.*?28.*?2a ... 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 2a
现在我们知道对应于上面的Test01.cs
的MSIL字节序列。 mkbundle
的输出包含完全相同的字节序列:
$ mkbundle -o Test01 Test01.exe --deps ... $ od -t x1 -w9999999 Test01 | fgrep -o '72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 2a' 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 72 01 00 00 70 28 01 00 00 0a 2a
不幸的是我不认为mkbundle(1)
有任何选项,比如--full-aot
。 所以AOT和创建一个(静态)bundle exe是截至目前相互排斥的(Mono 4.2.2.30)
- 在不使用IComparable 的情况下查找Max / Min元素
- 带SHA256的SignedXml计算签名
- 创建自定义RichTextBox控件
- 将CommandBindings添加到控件与使用RegisterClassCommandBinding之间有区别吗?
- 使用C#.Net可以被60整除的任何数字的正则表达式?
- 构建Visual Studio项目时构建Sandcastle文档
- 我试图学习如何将IEnumerable LINQ集合绑定到转发器
- C#以下方法或属性之间的调用不明确:’System.Math.Round(double,int)’和’System.Math.Round(decimal,int)
- 如何在C#中创建固定大小的字节数组用户类型?