首页 > 其他分享 >.Net NativeAOT另外一种选择-bflat

.Net NativeAOT另外一种选择-bflat

时间:2025-01-05 13:22:25浏览次数:1  
标签:-- NativeAOT cs Net true bflat

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位程序时时失败的.

标签:--,NativeAOT,cs,Net,true,bflat
From: https://www.cnblogs.com/chinasoft/p/18653281

相关文章

  • 用.NET X64 Native AOT编写的操作系统
    https://blog.csdn.net/sd7o95o/article/details/133191160 1.前言很多人想学习下.Net前沿技术和核心技术,这里推荐一个适合大家学习的案例,用.NETX64NativeAOT编写一个操作系统。2.概述MOOS(ToMakeMyOwn OperatingSystemProject)是一个采用.NETx64NativeAOT技术编写......
  • 如何看.net framework和.net core?
    了解.NETFramework和.NETCore的区别对于选择合适的技术栈和开发环境至关重要。以下是这两者的详细比较,包括它们的特点、适用场景、性能差异以及如何选择合适的框架。.NETFramework.NETFramework是Microsoft开发的第一个.NET平台,主要用于Windows操作系统上的应用......
  • 在 ASP.NET CORE 中上传、下载文件
    创建WebAPI来提供跨客户端和服务器的文件上传和下载是常有的事。本文将介绍如何通过ASP.NETCORE来实现。首先在VisualStudio中创建空的WebAPI项目,然后选择目标框架.NetCore3.1。创建名为FileController的控制器,提供操作文件的接口。namespaceFileAPI.Con......
  • 深入探索 Kubernetes:从基础概念到实战运维
    前言:在当今数字化转型的浪潮中,Kubernetes已然成为云原生应用部署与管理的核心力量。无论是初创企业寻求敏捷开发,还是大型企业应对复杂业务架构,掌握Kubernetes都能为你的技术之旅赋能。今天,就让我们一同深入Kubernetes的奇妙世界,揭开它神秘的面纱,从基础概念到实战运维,全方位领......
  • Linux 内核中的 Netlink 机制:内核与用户空间的通信桥梁
    在Linux系统中,内核与用户空间之间的通信是一个关键需求,尤其是在网络配置、系统监控和安全管理等领域。Netlink是Linux内核提供的一种高效、灵活的进程间通信(IPC)机制,专门用于内核与用户空间之间的数据交换。本文将深入探讨Netlink的基本概念、用途、通信机制以及如何通过......
  • NET拓展配置
    IP地址的分类ABC---单播地址私网IP地址A:10.0.0.0-10.255.255.255/8B:172.16.0.0-172.31.255.255/16--16b类网段C:192.168.0.0-192.168.255.255--Ip地址数量不够所有华为设备和NAT相关的配置都是在边界设备的出接口上配置静态NAT因为网络划分了私网IP地址和公网IP......
  • RoomFormer、FRI-Net
    WSLCUDA安装【一文解决】已安装CUDA与Pytorch但torch.cuda.is_available()为False_torch.cuda.isavailable返回false-CSDN博客cuda安装Ubuntu20.04安装CUDA&CUDNN手把手带你撸_ubuntu20.04安装cuda-CSDN博客【CUDA】Ubuntu系统如何安装CUDA保姆级教程(2022年最新)_ubunt......
  • 【强化学习】Double DQN(Double Deep Q-Network)算法
            ......
  • Profinet转EtherNet/IP网关连接AB PLC的应用案例
    某大型制造企业的生产车间同时采用了西门子S7-1500PLC作为核心控制系统的一部分,负责主要生产流程的控制与数据处理;而在特定生产环节,由于历史设备遗留或工艺配套需求,存在使用ABPLC的情况。这就导致了在整个自动化生产系统中,出现了两种不同的工业以太网协议(Profinet和Eth......
  • 在 Blazor 和 ASP.NET Core 中使用依赖注入和Scoped 服务实现数据共享方法详解
        依赖注入(DependencyInjection,简称DI)是一种设计模式,用于将对象的依赖关系从对象内部解耦出来,由外部容器进行管理和提供。在Blazor和ASP.NETCore中,DI是内置的核心功能,它通过服务生命周期(Transient、Scoped、Singleton)来管理依赖项。依赖注入(DependencyInj......