.Net 7 的 AOT 和 CLR有什么区别?

楔子:

AOT和 CLR的区别是什么呢?

大部分人肯定会说,一个编译成本地机器码(Native Code),一个是JIT即时编译的结果。

这么说,其实也对,但是不具体。具体应该怎么看呢?.

AOT

AOT实际上是为了静态编译做的一个变体,一直在不停的循环进化,它并不是.Net Core之后才有的,之前的.Net FrameWork也是有的。

在windows上,AOT是通过ilc.exe来加载托管的DLL,然后把这个DLL编译成.Obj文件。此后通过运行时也就是CLR来链接到这个.Obj文件,生成你最后看到的那个超大的Exe文件。

CLR

CLR的编译过程其实大家都清楚,具体如下:

源码 -》Rosyln(编译成托管DLL) -》CLR(加载DLL,并且调用RyuJit) -》RyuJit(编译成机器码)

区别

因为RyuJit是个即时的编译器,也就说你启动一个.Net程序之后,程序里面需要运行的数据就会加载到内存里面。如果你把这个程序给关掉了,内存就会被清除,之前的数据完全不存在。所以叫做即时编译。

而AOT则不同,它会保存编译的结果,然后在调用的时候进行结果的跳转。

注意了,AOT同样有CLR和GC,只不过它的CLR是通过Hostfxr来进行宿主调用的,而它的GC则是通过.Obj文件链接编译到了Exe里面。

你同样的反编译它,依然可以看到托管的代码。

结尾:

总体来说,AOT形成了一个独立的编译体系,有区别与目前的.Net 7 CLR 。
有人说微软以后可能会用AOT编译技术取代CLR,以微软的一贯尿性,还是极有可能的。

到时候大家,可能又要使劲的学习啦。