.Net Framework下面如何生成AOT呢?

2023-07-15 15:00:43

前言

有人問,老版本的.net frameworker能不能生成AOT?其實AOT預編譯,在.Net FrameWorker1.0裡面就有了。它叫做Ngen,只不過當時叫做生成本機映像,實際上還是一個東西,也就是預編譯。本篇來看下。原文:.Net Framework生成AOT

概括

1.介紹

現在的現代化的.Net已經到了.Net8了,它的AOT程式已經趨近於完美。可以單個Exe執行在MacOS/Linux/Win等平臺上。但是在.Net FrameWorker上面如果想用AOT應該怎麼搞呢?

微軟很早之前就提供了一個小工具,叫做:Ngen.exe。它跟你安裝Visual Studio的時候一起安裝進來了。它的路徑一般的在:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe //注意這裡是64位元的

它就是讓不跨平臺的.Net Frameworker生成本地機器碼,然後執行。

2.用法

應該怎麼用它呢?
一:程式碼
假如說你有以下.Net Frameworker程式碼,專案名稱NgenDemo

static void Main(string[] args)
{
    Console.WriteLine("hello Ngen Call The Main Method");
    Console.ReadLine();
}

二.注意事項:
注意一:把VS裡的AnyCpu切換成X64
注意二:開啟VS命令列工具,選擇64位元的
注意三:要以管理員的身份執行64位元VS命令列工具
三:生成
比如把以上NgenDemo這個專案放到桌面上。在Visual Studio裡面摁F5執行下,在目錄:

C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug

下面會生成:NgenDemo.exe。
開啟VS命令列工具:

x64 Native Tools Command Prompt for VS 2022  //注意這裡是64位元的

執行如下命令:ngen.exe install後面跟著NgenDemo.exe路徑

C:\Windows\System32>ngen.exe install "C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe"
Microsoft (R) CLR Native Image Generator - Version 4.8.9065.0
Copyright (c) Microsoft Corporation.  All rights reserved.
1>    Compiling assembly C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe (CLR v4.0.30319) ...

檢視下生成的映像是否正確:

C:\Windows\System32>ngen.exe display "C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe"
Microsoft (R) CLR Native Image Generator - Version 4.8.9065.0
Copyright (c) Microsoft Corporation.  All rights reserved.
NGEN Roots:
C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe
NGEN Roots that depend on "C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe":
C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe
Native Images:
NgenDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null <debug>

可以看到映像已經生成了。
到目錄:

C:\Windows\assembly\NativeImages_v4.0.30319_64

裡面看到一堆檔案,它就是生成本機映像,以及本機快取。此後在本機執行的時候,可以直接雙擊NgenDemo.exe就可以執行了。
如果想要解除安裝本機映像,執行如下命令:

C:\Windows\System32>ngen.exe uninstall "C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe"
Microsoft (R) CLR Native Image Generator - Version 4.8.9065.0
Copyright (c) Microsoft Corporation.  All rights reserved.
Uninstalling assembly C:\Users\Administrator\Desktop\NgenDemo\bin\x64\Debug\NgenDemo.exe

就可以解除安裝了。

以上就是.Net Framework生成的本機映像。它有極大的缺陷,每個機器上都要生成一次,其次它的程式集快取不能合併到一起,需要C:\Windows\assembly路徑下的檔案支援,才能夠執行。

所以後面微軟開啟了corert專案以及現在的nativeAOT專案,都是意圖取代它。


結尾

作者:江湖評談
歡迎關注我的公眾號(jianghupt),有更多精彩技術文章分享