.Net NativeAOT另外一种选择-bflat

news/2025/1/7 9:16:04/文章来源:https://www.cnblogs.com/chinasoft/p/18653281

https://www.qiufengblog.com/articles/dotnet-native-bflat.html

 

前言

说起bflat,还得先说NativeAOT,在.Net 7时,正式把NativeAOT合到Runtime中,地位是明显上升了,对NativeAOT的代码提交也越来越多了,之前还是corert时,几年也没有太大的进展.

这个时候的成果还是有ILC(ILCompiler),这时候国外的大佬,将C#带入了系统编程,就是zerosharp,zerosharp有三个示例.
  1. no-runtime: 不依赖CoreCLR运行时,限制比较多,使用值类型,加P/Invoke的方式,调用系统API,没有太多的依赖.
  2. with-runtime: 有CoreCLR运行时,可以完全使用托管和非托管及GC,生成Native原生的dll/lib,让C/C++调用
  3. efi-no-runtime: 可以让C#编写的程序,在没有系统的裸机上运行,当然也是有限制的,限制和no-runtime一样.
zerocsharp是依赖的ILC的,所以使用有一点麻烦,于是做zerocsharp的大佬,又开了一个项目,就是bflat,将ILC/.Net(.Net 7)及zerocsharp整合到一起,只需要配置一下环境变量,就可以使用了.这一点比NativeAOT使用要简单(当然这也是暂时的,下面会说是什么)

bflat生成Native原生程序

#zerocsharp地址
https://github.com/MichalStrehovsky/zerosharp.git#bflat官网地址:
https://flattened.net/#bflat github地址:
https://github.com/bflattened/bflat

下面看看如何使用:

#使用echo 将System.Console.WriteLine("Hello World");保存到hello.cs中
echo 'System.Console.WriteLine("Hello World");' > hello.cs#使用bflat 编译hello.cs 为Windows可执行程序
bflat build .\hello.cs --os:windows

看一下生成的可执行程序文件大小:

bflat生成native原生程序的大小

查看生成独立程序所以的动态库:

bflat生成native原生程序依赖系统动态库

bflat生成Native原生程序,不依赖CoreCLR,没有GC

#只需要加上 --stdlib:zero  --stdlib有三个参数 <DotNet|None|Zero> 
bflat build .\hello.cs --os:windows --stdlib:zero

看文件大小和系统依赖项:

bflat生成native原生程序时,使用zero依赖时依赖系统动态库

说一下.Net 8 NativeAOT

NativeAOT在.Net 8改进依然是很大的,在.Net 8对JIT是持续的改进,GC也进行小幅度的调整,在SIMD加入了AVX512,回到整体,在.Net 8对NativeAOT改进,就是简化使用.在.Net 8之前使用NativeAOT,需要引用Microsoft.DotNet.ILCompiler包,才可以,在.Net 8只需要这样:
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable><!--启用aot--><PublishAot>true</PublishAot><!--生成独立程序时,不生成调试符号--><DebuggerSupport>false</DebuggerSupport><InvariantGlobalization>true</InvariantGlobalization><UseSystemResourceKeys>true</UseSystemResourceKeys><!--ilc优化配置选项--><IlcOptimizationPreference>Size</IlcOptimizationPreference><IlcFoldIdenticalMethodBodies>true</IlcFoldIdenticalMethodBodies><IlcDisableReflection>true</IlcDisableReflection><IlcGenerateCompleteTypeMetadata>false</IlcGenerateCompleteTypeMetadata><IlcGenerateStackTraceData>false</IlcGenerateStackTraceData></PropertyGroup></Project>

测试源码:

Console.WriteLine("Hello, World!");

查看生成独立程序大小:

.Net 8使用NativeAOT生成独立程序的大小

在.Net 8 preview1时,使用NativeAOT生成独立的程序,只有1兆多一点,改进提升还是很大的,不过,在交叉编译Linux 64位程序时时失败的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864381.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20241415 《计算机基础与程序设计》课程总结

20241415 《计算机基础与程序设计》课程总结 每周作业链接汇总 第一周作业 参考基于VirtualBox虚拟机安装Ubuntu图文教程安装Linux系统 自学计算机科学概论》并提出问题第二周作业 了解计算思维和计算机结构第三周作业 计算机的数据表示法 C语言的基本数据类型第四周作业 门电路…

centos7 开启网卡相关设置

默认网卡是ens33 查看ip命令 ip a 或 ip addr 对于没有启用的网卡,使用命令ifup,开启网卡。注意网卡的名称ens33 找到自己对应的ifup ens33 永久默认启用网卡,关机或重启后,网卡自动启用该配置文件在/etc/sysconfig/network-scripts文件夹下,可以提前备份下 ifcfg-ens3…

20241417 《计算机基础与程序设计》课程总结

20241417 《计算机基础与程序设计》课程总结 每周作业链接汇总 第一周作业:链接 简要内容:课程概论,工业革命与浪潮之巅,信息与信息安全,计算机系统概论,计算机安全,计算的限制,计算思维第三周作业:链接 简要内容:数字分类与计数法,位置计数法,进制转换,模拟数据与…

PCIe扫盲——Base Limit寄存器详解

上一篇文章介绍了Type0型配置空间Header中的BAR的作用和用法,但是PCIe中的桥设备(Switch和Root中的P2P)又是如何判断某一请求(Request)是否属于自己或者自己的分支下的设备的呢?(定义范围) 这实际上是通过Type1型配置空间Header中的Base和Limit寄存器来实现的,这篇文章…

用.NET X64 Native AOT编写的操作系统

https://blog.csdn.net/sd7o95o/article/details/1331911601.前言很多人想学习下.Net前沿技术和核心技术,这里推荐一个适合大家学习的案例,用.NET X64 Native AOT编写一个操作系统。 2.概述MOOS(To Make My Own Operating System Project)是一个采用.NET x64 Native AOT技术…

Win32汇编学习笔记05

定位关键点3种方法: 过程函数 api 字符串 但是不确定用要哪一种方法,可以3种方法都用一下,因为在不同的程序,实用的方法是不一样的 窗口程序看控件信息 1.通过OD去看还可以用 spy ++ 查看还可以用vs2019 ,打开软件,找到对应控件直接看属性一般拿句柄没用,因为按钮是响应 WM_COM…

2025年,勇敢探索,才能突破困境

新年第一篇文章,不聊技术,聊聊今年的计划,以及未来的发展趋势。 在24年的第一篇文章中,我用“苟住求活”这个词形容了我当时的判断,如今回过头再看2024年,大家都过的很挣扎。经济环境进一步恶化,就业机会越发的稀少,降本增效降薪裁员,是去年很多人的真实经历。 今年的…

Java集合 —— LinkedList详解(源码)

在学习LinkedList之前先来了解一下链表链表 概念链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现的图中的1、2、3、4、5都是结构体,称为结点;结构体包含所存的数据和下一结点的地址。顺序表中的地址是连续的,而链表中的…

菜单

扫雷菜单准备写一个基于C的扫雷游戏,这是第一篇,内容:扫雷的主菜单 思路 显示菜单->用户选择->判断用户选项 实现 显示菜单 首先在main函数内显示菜单,菜单显示部分实现在 MainMenu 函数内 int main(void) {while (true){int iChoose = -1;MainMenu();//加载菜单} } …

如何解决数据库扩容后宝塔面板显示旧容量的问题?

当您完成数据库扩容后,发现宝塔面板仍然显示旧的容量,这可能是由于系统未能及时刷新磁盘信息或配置文件未更新所致。为了确保宝塔面板正确显示新的磁盘容量,请参考以下详细步骤进行处理:确认磁盘扩容成功:首先,确保磁盘扩容操作已经成功完成。可以通过命令行工具如lsblk或…

20241312《计算机基础与程序设计》课程总结

20241312《计算机基础与程序设计》课程总结 第一周作业: 简要内容:①课程概论②工业革命与浪潮之巅③信息与信息安全④计算机系统概论⑤计算机安全⑥计算的限制⑦计算思维 二维码: 第三周作业: 简要内容:①数字分类与计数法 ②位置计数法③进制转换④模拟数据与数字数据⑤…

云服务器根目录扩容后磁盘空间未增加

问题描述: 我已经升级了云服务器的配置,但根目录的空间大小并未增加。请帮我检查并解决这个问题。 详情回答: 您好!感谢您使用我们的云服务器服务。根据您的描述,您已经升级了云服务器的配置,但根目录的空间大小并未增加。这种情况通常是由于磁盘挂载或分区设置不当引起的…