首页 > 其他分享 >.Net native aot简单体验(一)

.Net native aot简单体验(一)

时间:2023-09-02 15:35:44浏览次数:31  
标签:安装 程序 aot Net true net native

.net native aot可以在发布时将 IL 代码编译为本地代码,从而提高应用程序的性能和效的发布方式,其主要优点有:

  • 缩小磁盘占用
  • 降低启动时间
  • 减少内存需求

如果用于个人发布的小程序来说,还有如下两个优点:

  • 不用安装
  • 防止反编译

虽然.net 7就已经支持native aot了,但只能用于控制台程序,使用场景有很大的限制,并没有怎么研究它。最近装了.net 8 preview版,发现是支持asp.net的aot的,便找了个时间简单的体验下aot。

前置条件

由于NativeAOT需要c++编译器将其变成native程序,因此除了.net core sdk外,还需要安装C++编译器, 在Windows下微软提供的方案是安装 "Desktop development with C++"的工作负载。

这还还需要附带安装一个VisualStudio,算是一个比较重的安装了。根据微软的文章,目前没有提供不安装VisualStudio的方案的计划。

参考文章:Tutorial: Publish an ASP.NET Core app using native AOT。

 

简单示例

以一个简单的控制台程序为例:

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

要添加aot发布选项,有两个方法:

1. 在csproj项目文件中添加PublishAot选项
<PropertyGroup>
    <PublishAot>true</PublishAot>
</PropertyGroup>

这样,通过dotnet publish发布的时候,会自动将其发布成native aot的程序

但需要注意的是,放在csproj的时候,会对ide造成一定的影响,会导致在ide中进行aot,这并不是我们所需要的,此时需要加条件参数 Condition=" '$(Configuration)' == 'Release' "

2. 在命令行中添加参数/p:PublishAot=true,完整命令如下:

dotnet publish /p:PublishAot=true

这两种方式本质是一样的,实际上,在PropertyGroup中的所有参数都可以通过/p的方式动态添加。在命令行中更灵活,具体看怎么使用看需求了。

打包后,由于这个程序非常简单,直接成功了,我使用的是.net 8 preview的版本,最终的发布包只有1.4m。看来.net 8对native aot有了进一步的优化。

 

WinForm程序AOT

目前.net 8还不支持对winform的aot,aot的时候会出现如下错误:Error NETSDK1175 : 启用剪裁时,不支持或不推荐使用 Windows 窗体

不过这个错误可以通过_SuppressWinFormsTrimError参数屏蔽掉

<PropertyGroup>
    <PublishAot>true</PublishAot>
    <_SuppressWinFormsTrimError>true</_SuppressWinFormsTrimError>
</PropertyGroup>

屏蔽掉后,可以顺利生产Native的程序,也能正常的启动和执行。不过编译过程中伴随着一大堆的告警,如果用这种方式发布文件还是需要好好测试的。

和控制台程序比起来,由于WinForm包含了UI库,其输出程序要大得多,达到了54mb。虽然对比100mb+的自包含模式要校不少,但如果是小程序这个体积还是有点难以接受的。由于已经是native程序了,我便尝试了用upx压缩了一下:

./upx --best WinFormsApp1.exe

File size Ratio Format Name
-------------------- ------ ----------- -----------
57275904 -> 17455616 30.48% win64/pe WinFormsApp1.exe

压缩效果还是非常令人满意的,带ui的winform程序直接被压缩到了16m,体积基本上解决7z的压缩包了。 后续的小程序都可以直接用这种方式发布了,不用安装运行时直接启动还是非常有吸引力的。

 

WPF程序AOT

WPF程序和WinForm一样不支持aot,会报错不支持,虽然有参数_SuppressWPFTrimError可以使用,但是编译后的程序无法启动。由于WPF程序使用了大量反射,支持aot天生有难度,估计短期是不用指望了。

  

标签:安装,程序,aot,Net,true,net,native
From: https://www.cnblogs.com/TianFang/p/17673717.html

相关文章

  • dotnet SemanticKernel 入门 调用原生本机技能
    本文将告诉大家如何在SemanticKernel里面调用原生本机技能,所谓原生本机技能就是使用C#代码编写的原生本地逻辑技能,这里的技能可讲的可不是游戏角色里面的技能哈,指的是实现某个功能的技能,这是构成AI强大能力的基础本文属于SemanticKernel入门系列博客,更多博客内容请参阅我......
  • dotnet SemanticKernel 入门 将技能导入框架
    在上一篇博客中和大家简单介绍了SemanticKernel里的技能概念,接下来咱准备将技能导入到SemanticKernel框架里面,进行一个管道式调用本文属于SemanticKernel入门系列博客,更多博客内容请参阅我的博客导航别着急,本篇博客还不涉及到任何的GPT相关的魔法,仅仅只是在C#层面......
  • .NET Core如何使用第三方组件Autofac
     首先先了解一下什么是AutofacAutofac用于在.NETCore应用程序中管理组件的生命周期和依赖关系。我们在开发一个项目的时在Program中注入依赖注入的生命周期,项目工程比较大的时候我们就要实现很多注入,最致命的缺点就是耽误太多时间,为解决这一问题的最好解决方法就是使用到......
  • dotnet SemanticKernel 入门 注入日志
    使用SemanticKernel框架在对接AI时,由于使用到了大量的魔法,需要有日志的帮助才好更方便定位问题,本文将告诉大家如何在SemanticKernel注入日志本文属于SemanticKernel入门系列博客,更多博客内容请参阅我的博客导航在KernelBuilder创建器里面可以通过WithLogger注入IL......
  • dotnet SemanticKernel 入门 自定义变量和技能
    本文将告诉大家如何在SemanticKernel框架内定义自定义的变量和如何开发自定义的技能本文属于SemanticKernel入门系列博客,更多博客内容请参阅我的博客导航自定义变量是一个非常有用的技能,自定义变量可以让炼丹师和程序员进行并行工作。由炼丹师对AI模型进行训练,从而找到对......
  • 【.Net-EF】用于快速回顾 - 0
    因为平时不做这方面项目,所以学了好几次,过了段时间就忘,特地写笔记用于快速回顾这一篇是EFCore简单的使用,主要内容是:通过控制台项目来学习依赖/数据库SqlServer创建2个Model,User和Role,1个User可有多个Role创建继承自DbContext的类,使用上面2个Model迁移、更新命令简单的CRUD......
  • .NetCore6 与 MySql 联查 (使用Lambda表达式树)
    MySql 官网链接:  https://www.donet5.com/Doc/99999999999/1180    2. 落实代码  or and 并且(满足所有条件) 或者(满足其中一个条件)  查询 OrIF !非空,查询  3. 联查表  官网找方法   4.落实  我这有一个字典表......
  • VS .NetCore 部署发布
    1.先安装IIS  步骤:  控制面板-程序和功能-启用或关闭Windows功能 确定 等待安装2.控制器右键点击发布3.点击发布  3.点击目标位置或者代开文件夹获取文件物理路径如图文件夹的路径所示  5. 复制刚才的物理路径   端......
  • .Net6.0 Redis操作其一List篇
    今天在写字典表时为了优化就用了redis,然后其中就又用到了redis中的一个LIst添加和读取的操作首先Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sortedset:有序集合)。今天讲的是其中之一lIst(列表)Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加......
  • KubeSphere 社区双周报 | KubeKey 新增网络插件 Hybridnet | 2023.08.18-08.31
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.08.18-2023.08.31。贡献者名单新晋KubeSphereCon......