• 自动秒收录
  • 软件:1973
  • 资讯:58003|
  • 收录网站:278291|

IT精英团

dotnet7 aot编译实战

dotnet7 aot编译实战

浏览次数:
评论次数:
编辑: 泽洋
信息来源: ITPUB
更新日期: 2022-09-24 01:09:12
摘要

0起因#这段日子看到dotnet7-rc1发布,我对NativeAot功能比较感兴趣,如果aot成功,这意味了我们的dotnet程序在防破解的上直接指数级提高。我随手使用asp.netcore-7.

  • 正文开始
  • 相关阅读
  • 推荐作品

0 起因#

这段日子看到点网7-rc1发布,我对NativeAot功能比较感兴趣,如果前嗅结节成功,这意味了我们的高级程序员程序在防破解的上直接指数级提高。我随手使用asp.netcore-7.0模板创建了一个默认的网程序,发现前嗅结节发布出来,web服务完全使用,这是之前那些试映版本做不到的。想到fastgithub本质上也是基于asp.netcore-6.0框架的项目,于是走上fastgithub的前嗅结节改造之路。

1 改造步骤#

1.1 升级框架#

将所有项目的目标框架值改为7.0,fastgithub使用目录Build.props,所以我只需要在目录Build.props文件修改一个地方,所有项目生效了。

1.2 升级nuget包#

所有项目的框架包进行升级,像有些是6.0.x版本的,如果有7.0.x-rc.x.x的更新包,就升级到最新罗马天主教版本。

1.3 json序列化#

如果您的使用JsonSerializer序列化了内部未公开的类型,则需要改为JsonSerializerContext(源代码生成)方式,比如我在想序列化下面的端点项目类型的实例,需要如下改进:

复制私有记录端点项(字符串Host,int Port);

[JsonSerializable(类型为(端点项目[]))]

[JsonSourceGenerationOptions(

WriteIndented=true,

PropertyNamingPolicy=JsonKnownNamingPolicy .茶包)]

私有分部类EndPointItemsContext : JsonSerializerContext

{

}

复制var utf8Json=JsonSerializer .serializetoutf8字节(终结点项,EndPointItemsContext .默认。端点项目数组);

2 aot发布#

我发布在相对上进行发布时有问题,我们需要在使用硬币指示器(硬币水平指示器的缩写)命令行界面(批处理脚本的命令行界面)来发布,cli发布还能为我们提供更多的编译信息输出。

2.1 单文件的发布命令#

副本集输出=。/发布

如果存在% output % " rd/S/Q“% output %”

. net publish-c Release/p : publish single file=true/p : publish trimmed=true-self-contained-r win-x64-o ' % output %/fastgithub _ win-x64 ' ./FastGithub/FastGithub.csproj

前嗅结节编译之后也是单个文件,所以如果您的程序使用发布单一文件模式发布不能正常运行的话,就不用试着前嗅结节发布了。

2.2 aot发布的命令#

副本集输出=。/发布

如果存在% output % " rd/S/Q“% output %”

. net publish-c Release/p : publish AOT=true/p : publish trimmed=true-self-contained-r win-x64-o ' % output %/fastgithub _ win-x64 ' ./FastGithub/FastGithub.csproj

我们只需要把之前的发布单一文件改为PublishAot,他们两个不能同时设置为没错。经过几分钟的满屏黄色警告之后,我们终于得到前嗅结节版本的40MB左右的fastgtihub.exe,迫不及待地运行了fastgithub.exe,不幸的是程序运行异常:

复制未处理的异常:系统type initialization exception :类型初始值设定项引发了异常。若要确定是哪种类型,请检查内部例外的堆栈跟踪属性。

-系统typeinitializationexception :

A type initializer threw an exception. To determine which type, inspect the InnerException's StackTrace property. ---> System.NotSupportedException: 'Org.BouncyCastle.Security.DigestUtilities+DigestAlgorithm[]' is missing native code or metadata. This can happen for code that is not compatible with trimming or AOT. Inspect and fix trimming and AOT related warnings that were generated when the app was published. For more information see https://aka.ms/nativeaot-compatibility at System.Reflection.Runtime.General.TypeUnifier.WithVerifiedTypeHandle(RuntimeArrayTypeInfo, RuntimeTypeInfo) + x5b at System.Array.InternalCreate(RuntimeType, Int32, Int32*, Int32*) + x5c at System.Array.CreateInstance(Type, Int32) + x46 at System.RuntimeType.GetEnumValues() + x86 at Org.BouncyCastle.Utilities.Enums.GetArbitraryValue(Type enumType) + xa at Org.BouncyCastle.Security.DigestUtilities..cctor() + x86

2.3 尝试解决BouncyCastle#

BouncyCastle是用于生成ca证书和服务器证书的第三方库,在dotnet6时或以前,我们没有其它库可以完成这个功能。以上的异常大概是提示了DigestUtilities这个类型的某个内部私有类型被裁剪了,所以无法创建这个已裁剪掉类型的数组类型。我想到可以给项目的ItemGroup加上<TrimmerRootAssembly Include="BouncyCastle.Crypto" />,让这个程序集不要裁剪,然后再进行新一轮aot编译,不幸的是这次是编译时异常:

CopyCVTRES : fatal error CVT1103: 无法读取文件 [D:\github\FastGithub\FastGithub\FastGithub.csproj]LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 [D:\github\FastGithub\FastGithub\FastGithub.csproj]C:\Program Files\dotnet\sdk\7.0.100-rc.1.22431.12\Sdks\Microsoft.DotNet.ILCompiler\build\Microsoft.NETCore.Native.targets(349,5): error MSB3073: 命令“"C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.34.31721\bin\Hostx64\x64\link.exe" @"obj\Release\net7.0\win-x64\native\link.rsp"”已退出,代码为 1123。 [D:\github\FastGithub\FastGithub\FastGithub.csproj]

2.4 移除BouncyCastle#

迫于无奈,我们必须移除对BouncyCastle的依赖,转为使用基础库来实现证书生成,这方面几乎没有任何可以查到有帮助的资料,我花了整整一天来改造,感兴趣证书生成的同学,可以参考CertGenerator.cs。去掉BouncyCastle之后再aot发布,程序可以运行起来了,没有任何异常,但是发现程序没有拦截任何流量。

2.5 查找程序不干活的原因#

由于没有任何的异常输出,咱也不知道是啥情况,现在使用debug模式继续aot发布,然后运行fastgithub.exe,在vs附加到fastgithub进程,下断点分析。经过一路跟踪,我发现如下一个分支,总是进入return逻辑:

Copyvar domain = question.Name;if (this.fastGithubConfig.IsMatch(question.Name.ToString()) == false){    return;}

我想看看fastGithubConfig现在是什么值,为什么总是不匹配,但是经过aot之后,无法发现fastGithubConfig这个局部变量,而函数内的变量,也不再是crl类型,而是一种为调试而存在的代理类型一样,可看的信息也很少。
于是我加入大量的log,通过log看看fastGithubConfig是什么值,最后发现是配置绑定到Options的字典类型属性时,绑定不成功(但也没有任何异常或日志)。

2.6 解决配置绑定到字典的问题#

这个问题咱实在不知道怎么解决,那就github上发起问题吧:services.Configure(configuration) failure at PublishAot,果然回复很积极,告诉咱们目前可以在任意调用的函数加上[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Dictionary<string, DomainConfig>))]。经过这么修改之后,配置绑定到Options生效了。

3 后续#

经过这么一个实际项目aot之后,我对aot有了初步的了解,个人觉得aot基本可以用小型程序的发布,期待到dotnet8之后,NativeAot变成没有坑。

了解更多关于k8s中Pod的详细信息
« 上一篇 2022-09-24
  • 了解更多关于k8s中Pod的详细信息
    0阅读 0条评论 个赞
    k8s中Pod的理解基本概念k8s为什么使用Pod作为最小的管理单元如何使用Pod1、自主式Pod2、控制器管理的Pod静态PodPod的生命周期Pod如何直接暴露服务hostNetw……
  • 2流高手速成记(之二):跳羚之基础网开发
    0阅读 0条评论 个赞
    现在,我们已经能自行完成SpringBoot的初级项目搭建了,接下来看如何实现一些Web开发中的基础功能。先看项目完整的目录结构:1.返回Json数据创建model文件夹,并新建Person类,代码……
  • Lua脚本在Redis交易中的应用实践
    0阅读 0条评论 个赞
    使用过Redis事务的应该清楚,Redis事务实现是通过打包多条命令,单独的隔离操作,事务中的所有命令都会按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务中的命令要么全部……
  • IDEA远程部署项目到Docker
    0阅读 0条评论 个赞
    前言最近在写东西部署到服务器,结构是springboot工程配合docker部署。但是每次部署都3个步骤:本地构建jar复制jar到远程服务器用DockerFile构建镜像部署次数一多,我就怀疑人生了……
  • Object.keys的‘怪异’特性 你值得收藏!
    0阅读 0条评论 个赞
    先从‘诡异’的问题入手例1:纯Number类型的属性constobj={1:1,6:6,3:3,2:2}console.log('keys',Object.keys(o……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
  • 【MySQL】DDL因正在等待表元数据锁定卡住
    0阅读 0条评论 个赞
    在数据库空闲时间,对表做碎片整理:1altertablemy_abcengine=innodb;发现会话被阻塞,显示状态是:1Waitingfortablemetadatalock手动断开alte……
  • 将SQL Server数据库迁移到Azure SQL
    0阅读 0条评论 个赞
    最近有个维护的项目需要把SQLServer2012的数据库迁移到AzureSQL上去,迁移过程可谓一波三折,故在此分享这次迁移中碰到的点点滴滴,希望对朋友们有所帮助。AzureSQL……
  • 记录在线超时的分析和故障排除过程
    2阅读 0条评论 个赞
    .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
  • 《2022 分布式数据库发展趋势研究报告》的解释
    9阅读 0条评论 个赞
    分布式数据库近年来广受关注,目前,对分布式数据库的讨论,已经从什么是分布式数据库,为什么要用分布式数据库,转变为怎样规划应用分布式数据库。但分布式数据库有3条不同的技术路线,这无疑增加了选型难度,到底……
  • [PostgreSql]生产级数据库安装需要考虑哪些问题?
    0阅读 0条评论 个赞
    大家好,我是字母哥(coder)!我让公司的小伙伴写一个生产级别的PostgreSQL的安装文档,结果他和我说:“不是用一个命令就能安装好么?还用写文档么?”。我知道他想说的是这个命令:yumins……
  • 内存泄漏——原因、避免和位置
    0阅读 0条评论 个赞
    .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
  • 如何使用helm优雅地安装prometheus-operator并监控k8s集群微服务
    0阅读 0条评论 个赞
    前言:随着云原生概念盛行,对于容器、服务、节点以及集群的监控变得越来越重要。Prometheus作为Kubernetes监控的事实标准,有着强大的功能和良好的生态。但是它不支持分布式,不支持数据……
  • 渗透攻击和防御网络-简单的SQL注入
    0阅读 0条评论 个赞
    1背景京东SRC(SecurityResponseCenter)收录大量外部白帽子提交的sql注入漏洞,漏洞发生的原因多为sql语句拼接和Mybatis使用不当导致。2手工检测2.1前置知识……
  • 设计模式介绍——单一模式
    0阅读 0条评论 个赞
    简介一个类只允许创建一个对象(或实例),那么这个类就是一个单例类,这种设计模式称作单例设计模式(SingletonDesignPattern),简称单例模式。单例模式保证系统内存中只存在一个对象,……
  • 卡夫卡开启简单认证和安全层认证【窗口e详细版】
    0阅读 0条评论 个赞
    一、JAAS配置#Zookeeper配置JAASzookeeper环境下新增一个配置文件,如zk_server_jass.conf,内容如下:Server{org.apache.kafka.comm……
  • Velox简介:一个开源的统一执行引擎
    0阅读 0条评论 个赞
    •Meta正在引入Velox,这是一个开源的统一执行引擎(unifiedexecutionengine),旨在加速数据管理系统和简化其开发。•Velox正在积极开发中,Meta在2022……
  • 1 Docker安装Nexus3
    0阅读 0条评论 个赞
    1.1创建目录在硬盘上创建Nexus3的主目录:mkdir-p/Users/yygnb/dockerMe/nexus3为该目录添加权限:chmod777-R/Users/yygnb/d……
  • 面试问题:Java序列化和反序列化
    0阅读 0条评论 个赞
    目录序列化和反序列化的概念应用场景?序列化实现的方式继承Serializable接口,普通序列化继承Externalizable接口,强制自定义序列化serialVersionUID的作用静态变量不会……
  • 海量小文件总结及解决策略(三)NameNode、Hadoop归档文件等
    0阅读 0条评论 个赞
    .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
  • Java SE 19的新特性
    0阅读 0条评论 个赞
    源码#源仓库:Github:java_new_features镜像仓库:GitCode:java_new_featuresHashMap新的构造方法#JavaSE19,构造哈希表的时候,由于有扩……
  • Python条件语句的用法
    0阅读 0条评论 个赞
    python条件语句使用if表达式,难度不高,需要注意的是嵌套用法,以及如何设置对应的条件。if条件判断语句python语句是按固定顺序执行的,先执行前面的语句,再执行后面的语句。如果你像要程……
  • 基于iframe的微前端框架——青田
    38阅读 0条评论 个赞
    vivo互联网前端团队-JiangZuohan一、背景VAPD是一款专为团队协作办公场景设计的项目管理工具,实践敏捷开发与持续交付,以「项目」为核心,融合需求、任务、缺陷等应用,使用敏捷迭代、小……
  • MySQL查询性能优化指数下推的七大武器
    0阅读 0条评论 个赞
    前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下:MySQL查询性能优化七种武器之索引潜水MySQL查询性能优化七种武器之链路追踪今天要讲的是MySQL的另一种查询性能优化方式—索……
  • 如何优雅地转换Bean对象
    0阅读 0条评论 个赞
    背景我们的故事要从一个风和日丽的下午开始说起!这天,外包韩在位置上写代码~外包韩根据如下定义PO(persistantobject):持久化对象,可以看成是与数据库中的表相映射的java对象。最……
  • IDEA远程部署项目到Docker
    0阅读 0条评论 个赞
    前言最近在写东西部署到服务器,结构是springboot工程配合docker部署。但是每次部署都3个步骤:本地构建jar复制jar到远程服务器用DockerFile构建镜像部署次数一多,我就怀疑人生了……
最近发布资讯
更多