.NET CoreRT AOT原生程序编译使用的一些小建议

微软为 dotnet 提供的一个.NET托管程序的原生程序AOT编译器,但目前限制还是蛮多的,比如动态载入程序集、动态表达式、Emit(反射发出)这些都不被支持(备注:动态表达式,底层实现是基于 Emit)

本文不东扯淡,西扯淡跑出来坑人,只提供一些关于 .NET CoreRT AOT原生编译相对而言较为中肯的建议。

1、动态编程限制:

由于目前.NET AOT编译技术上的一些限制,微软还没有做到把需要动态JIT编译的部分与AOT静态编译的部分混合在一起,只能单AOT静态编译,所以这也就导致了动态编程凉凉,所以不要在程序代码里面用 dynamic 关键字,这会导致.NET编译器生成对应的动态表达式(.NET 4.0 System.Linq.Expressions.Expression)这些表达式会在程序运行时被动态构建,而AOT静态编译首先就干掉了运行时动态编程的能力,当然仍旧保留使用 dynamic 关键字的代码也是可以的,要么不调用,要么TRY-CATCH起来,否则程序立马崩溃。

2、非公开成员反射限制:

尽量不要通过反射调用函数、获取/设置属性/字段的值,但仍旧需要这些是可行的,前提是必须保证成员的公开性,不可以是非 public,否则AOT编译后是无法被反射的,它并不是配置 rd.xml 可解决的问题。

补充:反射不允许不可静态分析性,即动态搞一些字符串运算最终命名在反射的行为,这种是不可以的,Yada!。

3、只用 2.0/2.1/3.0/3.1 .NET CORE SDK.

4、只用 1.0.0-alpha-* 版本的AOT编译器,编译出的原生二进制效率最好,前提是用 .NET CORE SDK 2.1 及以上编译的产品,.NET CORE SDK 2.0 性能相对要弱一点。

     目前最新是 7.0.0-* 版本的AOT编译器,只有 1.0.0-alpha-* (ilc)编译出的原生二进制体积最小,并且工作代码效能最高,一般一个原生程序体积越大通常意味着代码效率越加底下。

5、C#/VB.NET 编译代码按微软官方指导原则严格编写代码,否则AOT编译器可能编译代码失败(1.0.0版本),(7.0.0)版本,此问题被大规模改善。

6、CORE RT 服务器上就绪,建议仅限于C/S架构服务器,须妥善的处理工程代码.NET Native AOT原生编译兼容问题。

7、解决方案上面建议按项目需求,妥善配置以下几个 CORE RT 选项

         不要生成堆栈调试数据,即不需要易于阅读的.NET堆栈信息【减少程序体积】
        false

        裁剪不必要的.NET元数据【减少程序体积】
        true

        禁止.NET反射,前提不用反射【减少程序体积】
        true

        不变全球化,只需要一个 “中文(中国)” 可开【减少程序体积】
        true

        优化首选项,Speed 速度选项会导致体积变大【尽可能内联需要.NET程序函数上使用特性声明 inline】,Size 大小选项会减少大小会导致代码性能变低,可以理解为:C/C++ compiler /O0 与 /O2 之间的一个区别。
        Speed

        折叠具有相同 “IL 中间代码” 的方法主体(减少重复代码量),可以减少程序体积,但会导致函数调用堆栈变得混乱。
        true
   

你可能感兴趣的:(C#,.NET,.netcore)