C#了您所知,但使用Go-Inspired工具,可以在框中产生小型,自我和本机可执行文件。
$ echo' system.console.writeline("你好世界"); ' > hello.cs $ bflat build hello.cs $ ./hello hello world $ bflat build hello.cs -os:windows $ file ./hello.exe hello.exe:pe32 +可执行(控制台)x86-64,适用于MS Windows
BFLAT是罗斯林的混合物 - "官方" C#编译器,用于生成.NET可执行文件 - 和NAÉECORERT) - 基于Coreclr' s crossgen2的时间编译器前提前的实验。由于此,您可以使用高性能Coreclr GC和本机代码生成器(Ryujit)访问最新的C#功能。
BFLAT将两个组件在一起将两个组件融合到时间交叉杂志和运行时为C#。
它可以生成本机可执行文件,或通过FFI从其他语言调用的本机共享库。
查看此次储存的“版本”选项卡,然后下载与主机系统匹配的编译器。这些都是交叉口杂志,可以针对任何支持的OSS /架构。
将存档解压缩到一个方便的位置,并将根添加到路径中。所有'重新设置。有关耦合样本的示例目录。
源代码位于相应的ROSLYN / NativeAOS存储库中。我'虽然没有准备好人看到(或接受拉杆的拉出请求)。如果你认为BFLAT很有用,你可以把尖端留在我的提示罐中,并在一个注释中包含你的github用户名,以便我可以在i&#39准备时向您提供私人回购。
默认情况下,BFLAT会产生2 MB和3 MB的可执行文件,即使是最简单的应用程序也是如此。有多种原因:
BFLAT包括关于所有已编译方法的堆栈跟踪数据,以便它可以打印漂亮的异常堆栈迹线
即使是最简单的应用程序可能最终会调用反射(至e.g.获取OutofMemoryException类的名称),全球化等。
"更大"为友好性和便利选择默认值。要获得更紧密地匹配低级编程语言的经验,请指定 - 不反映,--no-stacktrace-data, - 全球化和 - nf-exception-messages的参数到bflat构建。
使用系统。诊断;使用静态系统。安慰;写道($" nullreferenceException消息是:{new nullreferenceException()。消息}");写道($" int的运行时类型名为:{typeof(int)}");写道($"盒装整数的类型是{(123.Gettype()== typeof(int)?"":"不是")}等于typeof( int)");写入线($"盒装整数的类型是{(123. gettype()== typeof(byte)?"":"不是")}等于typeof(字节)");写道($"大写'Вторник'' {"Вторник" toupper()}'");写道($"当前堆栈帧是{new stacktrace()。GetFrame(0)}");
nullReferenceException消息是:对象引用未设置为对象的实例。int的运行时类型名为:system.int32type框整数等于typeof(int)盒装整数的类型不等于typeof(字节)大写'Вторник'是'Вторник'当前堆栈帧是< program> $。< main> $(String [])+ 0x154在文件中的偏移量340:line:列<文件名未知>:0:0
nullReferenceException消息是:arg_nullreferenceException int的运行时类型为命名:zetperva:0x00048bd0type框整数等于typeof(int)盒式整数的类型不等于Typeof(字节)大写的大写字母和#39;Вторник'是'Вторник'当前堆栈帧是MS!< baseaeaddress> + 0xb82d4在文件中的偏移量340:line:列<文件名未知>:0:0
所有选项打开,可以舒适地舒适地符合1 MB以下的有用程序。上面的程序在撰写本文时为735 kB。输出可执行文件是任何其他的可执行文件。您可以使用像UPX这样的工具进一步压缩(到〜300 KB范围)。
如果您'在类似UNIX的系统上,您可能希望运行Strip工具以从可执行文件中删除调试信息。 Windows将调试信息放在单独的PDB文件中,不需要条带。
除了命令行提供的预处理器定义外,BFLAT还定义了几个其他符号:BFLAT(始终定义),调试(未优化时定义),Windows / Linux / MacOS(当目标是目标时),x86 / x64 / ARM / ARM64(当相应的架构是针对性的时)。
使用bflat调试与任何其他本机代码相同的应用程序。在您喜欢的调试器(Linux上的GDB或LLDB或Windows上的Visual Studio或Windbg上)启动生成的可执行文件和您' ll能够设置断点,步骤并查看本地变量。
michalstrehovsky / bflat#3 - 依赖libssl don' t上Linux的工作 - 这包括很多加密。我们需要静态链接到libssl,但框架代码非常适合那个。需要一点工作。
Michalstrehovsky / Bflat#3 - 全球化在Linux上无条件禁用 - 我们需要与ICU链接。需要一点工作。
michalstrehovsky / bflat#4 - 无Linux主机BFLAT编译器。 这是来自Libssl的突出终止的退缩。 显然C#编译器坚持计算文件的SHA Hashes,我们需要一个工作libssl。