我正在用 C# 编写裸机操作系统内核,我想从命令行执行 .NET AOT 编译器,而不使用
dotnet
命令,同时避免使用 csproj 文件。
在搜索我的文件系统时,我注意到 ILC(本机 AOT 编译器)的副本存储在本地计算机上的以下位置:
C:\Users\frank\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\7.0.14"\tools
我实际上可以成功调用它,
ilc <args>
,并且它确实执行了提前编译。
不幸的是,我不知道它是如何到达那里的,我需要一种可靠的方法来设置新的构建环境。
如何确定性地安装并运行 .NET AOT 编译器? (.NET 版本 7 或 8 都可以)。
我制作了一个 .NET 工具包装器来简化整个过程。要安装它,只需执行以下操作:
dotnet tool install -g ilc
...然后,您可以调用
ilc
,就像它在您的 PATH
上一样:
$ ilc --version
9.0.0-preview.6.24327.7+573461dc897731c11d6166574b77a8c3aabba220
它不需要任何更新,因为它会自动跟踪 .NET 版本。
但是,如果您想在没有工具的情况下完成此操作,请参阅下面我之前的回答。
如果您想通过 ILC 手动将 IL 程序集转换为本机代码,则必须添加相应的 NuGet 包。包的名称取决于运行时标识符 - 它的格式为
runtime.<runtime identifier>.Microsoft.DotNet.ILCompiler
。添加该包后,它将出现在您的 global-packages
目录中,您可以在其中 tools
目录下找到 ilc。
如果您没有 .NET 项目(
*.csproj
),则必须创建一个来添加 NuGet 引用:
dotnet new classlib tmp-nuget
cd ./tmp-nuget
...添加软件包,例如,对于 x86-64 (AMD64) Linux:
dotnet add package runtime.linux-x64.Microsoft.DotNet.ILCompiler --version 8.0.6
然后,找到您的
global-packages
文件夹:
$ dotnet nuget global-packages all -l
global-packages: /home/asc/.nuget/packages/
然后,把它们放在一起:
$ "/home/asc/.nuget/packages/runtime.linux-x64.microsoft.dotnet.ilcompiler/8.0.6/tools/ilc" -v
8.0.6+3b8b000a0e115700b18265d8ec8c6307056dc94d
不要忘记删除该临时目录(当然,如果您确实需要首先创建它):
cd ..
rm -rf tmp-nuget
不幸的是,我找不到直接将 NuGet 包安装到全局包目录的方法(a'la
npm
的 -g
标志)。即使您已经有 .NET 项目,我也建议使用临时目录,因为它会添加一个 PackageReference
,这可能会在与 .NET SDK 一起使用时导致不可预见的后果。