我正在用 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 都可以)。
如果您想通过 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 一起使用时导致不可预见的后果。