.NET8 ILC+Link原理剖析

文摘   科技   2024-04-28 11:35   湖北  

点击上方蓝字 江湖评谈设为关注/星标




前言

先了解下概念,ILC是AOT编译器。ILC有很多参数,多达上百个。为了方便这些参数进行脚本化的输出,rsp文件即是做这种工作的。

参考资料:

  1. NET7新编译器ILC简析

  2. NET7 CLR和ILC编译函数过程

  3. NET7新编译器ILC简析(二)

  4. NET9 AOT ILC的重大变化

  5. NET AOT完全自举了吗?

  6. NET8 AOT和LLVM什么关系?

参数

通过nuget下载runtime.win-x64.Microsoft.DotNet.ILCompiler,在目录:

C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\tools

这里的版本是:8.0.1,下即可看到ilc.exe,它的部分命令如下:

-o:输出的文件-r:编译时候需要引用的文件--targetos:win(平台)--targetarch:x64(指令集)--dehydrate(压缩运行时数据结构)-O:启用代码优化-g:生成调试细腻--initassembly:包含库初始化器的程序集--directpinvoke:平台调用(P/Invoke)相关的.NET Native编译器的选项--feature:特性,一般类似于System.StartupHookProvider.IsSupported=false--runtimeknob:--stacktracedata:持在运行时生成堆栈跟踪字符串--scanreflection:扫描IL以查找反射模式--win32resourcemodule:资源文件模块比如ConsoleApp17--nowarn:禁用特定的警告消息,比如:"1701;1702;IL2121;1701;1702"--singlewarn:每个程序集生成单个AOT/修剪警告--nosinglewarnassembly:扩展给定程序集的AOT/修剪警告--resilient:忽略未解析的类型、方法和程序集,默认为false--generateunmanagedentrypoints:给定的程序集生成非托管入口点

例子

简单的例子:

private static void Main(string[] args){   Console.WriteLine("你好,世界!!");   Console.ReadLine();}

csproj文件添加如下:

 <PublishAot>true</PublishAot>

csproj文件所在运行命令:

dotnet publish -r win-x64 -c release

在目录obj\release\net8.0\win-x64\native下有rsp以及obj文件。

ConsoleApp17.ilc.rsp是ILC的编译文件,link.rsp是C++ bootstrap的链接文件。ConsoleApp17.obj则是ILC生成的目标文件。ConsoleApp17.ilc.rsp文件如下:

obj\release\net8.0\win-x64\ConsoleApp17.dll-o:ConsoleApp17.obj-r:C:\Users\Administrator\.nuget\packages\microsoft.netcore.app.runtime.win-x64\8.0.1\runtimes\win-x64\lib\net8.0\WindowsBase.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\System.Private.CoreLib.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\System.Private.DisabledReflection.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\System.Private.Reflection.Execution.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\System.Private.StackTraceMetadata.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\System.Private.TypeLoader.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\Microsoft.CSharp.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\Microsoft.VisualBasic.Core.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\Microsoft.VisualBasic.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\Microsoft.Win32.Primitives.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\Microsoft.Win32.Registry.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\mscorlib.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\netstandard.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.AppContext.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Buffers.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Collections.Concurrent.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Collections.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Collections.Immutable.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Collections.NonGeneric.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Collections.Specialized.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.ComponentModel.Annotations.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.ComponentModel.DataAnnotations.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.ComponentModel.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.ComponentModel.EventBasedAsync.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.ComponentModel.Primitives.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.ComponentModel.TypeConverter.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Configuration.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Console.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Core.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Data.Common.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Data.DataSetExtensions.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Data.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Diagnostics.Contracts.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Diagnostics.Debug.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Diagnostics.DiagnosticSource.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Diagnostics.FileVersionInfo.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Diagnostics.Process.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Diagnostics.StackTrace.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Diagnostics.TextWriterTraceListener.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Diagnostics.Tools.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Diagnostics.TraceSource.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Diagnostics.Tracing.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Drawing.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Drawing.Primitives.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Dynamic.Runtime.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Formats.Asn1.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Formats.Tar.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Globalization.Calendars.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Globalization.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Globalization.Extensions.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.Compression.Brotli.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.Compression.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.Compression.FileSystem.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.Compression.ZipFile.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.FileSystem.AccessControl.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.FileSystem.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.FileSystem.DriveInfo.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.FileSystem.Primitives.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.FileSystem.Watcher.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.IsolatedStorage.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.MemoryMappedFiles.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.Pipes.AccessControl.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.Pipes.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.IO.UnmanagedMemoryStream.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Linq.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Linq.Expressions.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Linq.Parallel.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Linq.Queryable.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Memory.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.Http.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.Http.Json.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.HttpListener.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.Mail.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.NameResolution.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.NetworkInformation.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.Ping.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.Primitives.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.Quic.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.Requests.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.Security.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.ServicePoint.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.Sockets.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.WebClient.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.WebHeaderCollection.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.WebProxy.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.WebSockets.Client.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Net.WebSockets.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Numerics.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Numerics.Vectors.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.ObjectModel.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Private.DataContractSerialization.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Private.Uri.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Private.Xml.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Private.Xml.Linq.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Reflection.DispatchProxy.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Reflection.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Reflection.Emit.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Reflection.Emit.ILGeneration.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Reflection.Emit.Lightweight.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Reflection.Extensions.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Reflection.Metadata.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Reflection.Primitives.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Reflection.TypeExtensions.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Resources.Reader.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Resources.ResourceManager.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Resources.Writer.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.CompilerServices.Unsafe.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.CompilerServices.VisualC.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.Extensions.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.Handles.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.InteropServices.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.InteropServices.JavaScript.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.InteropServices.RuntimeInformation.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.Intrinsics.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.Loader.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.Numerics.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.Serialization.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.Serialization.Formatters.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.Serialization.Json.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.Serialization.Primitives.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Runtime.Serialization.Xml.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.AccessControl.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Claims.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Cryptography.Algorithms.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Cryptography.Cng.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Cryptography.Csp.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Cryptography.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Cryptography.Encoding.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Cryptography.OpenSsl.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Cryptography.Primitives.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Cryptography.X509Certificates.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Principal.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.Principal.Windows.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Security.SecureString.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.ServiceModel.Web.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.ServiceProcess.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Text.Encoding.CodePages.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Text.Encoding.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Text.Encoding.Extensions.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Text.Encodings.Web.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Text.Json.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Text.RegularExpressions.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Threading.Channels.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Threading.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Threading.Overlapped.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Threading.Tasks.Dataflow.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Threading.Tasks.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Threading.Tasks.Extensions.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Threading.Tasks.Parallel.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Threading.Thread.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Threading.ThreadPool.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Threading.Timer.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Transactions.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Transactions.Local.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.ValueTuple.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Web.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Web.HttpUtility.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Windows.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Xml.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Xml.Linq.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Xml.ReaderWriter.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Xml.Serialization.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Xml.XDocument.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Xml.XmlDocument.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Xml.XmlSerializer.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Xml.XPath.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\System.Xml.XPath.XDocument.dll-r:C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\framework\WindowsBase.dll--targetos:win--targetarch:x64--dehydrate-O-g--initassembly:System.Private.CoreLib--initassembly:System.Private.StackTraceMetadata--initassembly:System.Private.TypeLoader--initassembly:System.Private.Reflection.Execution--directpinvoke:System.Globalization.Native--directpinvoke:System.IO.Compression.Native--directpinvokelist:C:\Users\Administrator\.nuget\packages\microsoft.dotnet.ilcompiler\8.0.1\build\WindowsAPIs.txt--feature:Microsoft.Extensions.DependencyInjection.VerifyOpenGenericServiceTrimmability=true--feature:System.ComponentModel.TypeConverter.EnableUnsafeBinaryFormatterInDesigntimeLicenseContextSerialization=false--feature:System.Diagnostics.Tracing.EventSource.IsSupported=false--feature:System.Reflection.Metadata.MetadataUpdater.IsSupported=false--feature:System.Resources.ResourceManager.AllowCustomResourceTypes=false--feature:System.Runtime.CompilerServices.RuntimeFeature.IsDynamicCodeSupported=false--feature:System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false--feature:System.Runtime.InteropServices.EnableConsumingManagedCodeFromNativeHosting=false--feature:System.Runtime.InteropServices.EnableCppCLIHostActivation=false--feature:System.Runtime.InteropServices.Marshalling.EnableGeneratedComInterfaceComImportInterop=false--feature:System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization=false--feature:System.StartupHookProvider.IsSupported=false--feature:System.Text.Encoding.EnableUnsafeUTF7Encoding=false--feature:System.Text.Json.JsonSerializer.IsReflectionEnabledByDefault=false--feature:System.Threading.Thread.EnableAutoreleasePool=false--feature:System.Linq.Expressions.CanEmitObjectArrayDelegate=false--runtimeknob:Microsoft.Extensions.DependencyInjection.VerifyOpenGenericServiceTrimmability=true--runtimeknob:System.ComponentModel.TypeConverter.EnableUnsafeBinaryFormatterInDesigntimeLicenseContextSerialization=false--runtimeknob:System.Diagnostics.Tracing.EventSource.IsSupported=false--runtimeknob:System.Reflection.Metadata.MetadataUpdater.IsSupported=false--runtimeknob:System.Resources.ResourceManager.AllowCustomResourceTypes=false--runtimeknob:System.Runtime.CompilerServices.RuntimeFeature.IsDynamicCodeSupported=false--runtimeknob:System.Runtime.InteropServices.BuiltInComInterop.IsSupported=false--runtimeknob:System.Runtime.InteropServices.EnableConsumingManagedCodeFromNativeHosting=false--runtimeknob:System.Runtime.InteropServices.EnableCppCLIHostActivation=false--runtimeknob:System.Runtime.InteropServices.Marshalling.EnableGeneratedComInterfaceComImportInterop=false--runtimeknob:System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization=false--runtimeknob:System.StartupHookProvider.IsSupported=false--runtimeknob:System.Text.Encoding.EnableUnsafeUTF7Encoding=false--runtimeknob:System.Text.Json.JsonSerializer.IsReflectionEnabledByDefault=false--runtimeknob:System.Threading.Thread.EnableAutoreleasePool=false--runtimeknob:System.Threading.ThreadPool.UseWindowsThreadPool=true--runtimeknob:System.Linq.Expressions.CanEmitObjectArrayDelegate=false--runtimeknob:RUNTIME_IDENTIFIER=win-x64--stacktracedata--scanreflection--win32resourcemodule:ConsoleApp17--nowarn:"1701;1702;IL2121;1701;1702"--singlewarn--nosinglewarnassembly:ConsoleApp17--resilient--generateunmanagedentrypoints:System.Private.CoreLib--feature:System.Diagnostics.Debugger.IsSupported=false--feature:System.Threading.ThreadPool.UseWindowsThreadPool=true

以上解释,可以对照上面命令小节。

此时就可以通过ilc.exe以AOT的模式,把CosnoleApp17.dll编译成win的目标文件obj。这里特别需要注意版本号,不同.net版本号编译会出错。比如我这里的ilc.exe是8.01的版本,rsp里面的-r命令引用的必须是8.0.1的包。

ilc.exe @ConsoleApp17.ilc.rsp

注意这个@符号。然后在当前目录下就可以看到ConsoleApp17.obj文件了。这是ILC生成的目标文件,这个目标文件不能直接运行,所以需要通过link.exe链接下。

链接

通过-o:ConsoleApp17.obj生成的obj文件,是不能直接运行的,所以这里需要链接下。打开vs命令行,看下link.exe地址:

E:\Visual Studio IDE>where linkE:\Visual Studio IDE\VC\Tools\MSVC\14.39.33519\bin\Hostx86\x86\link.exe

注意它这个链接器目录与C++引导文件bootstrap(关于bootstrap参考:Net8的AOT引导程序BootStrap)的链接器用的是同一个。把这个目录添加到系统环境变量path里面去。打开上面的link.rsp看下:

"obj\release\net8.0\win-x64\native\ConsoleApp17.obj"/OUT:"bin\release\net8.0\win-x64\native\ConsoleApp17.exe"/LIBPATH:"E:\Visual Studio IDE\VC\Tools\MSVC\14.39.33519\ATLMFC\lib\x64"/LIBPATH:"E:\Visual Studio IDE\VC\Tools\MSVC\14.39.33519\lib\x64"/LIBPATH:"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64"/LIBPATH:"D:\Windows Kits\10\lib\10.0.22621.0\ucrt\x64"/LIBPATH:"D:\Windows Kits\10\\lib\10.0.22621.0\\um\x64""C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\bootstrapper.obj""C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\Runtime.WorkstationGC.lib""C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\eventpipe-disabled.lib""C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\Runtime.VxsortEnabled.lib""C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\System.Globalization.Native.Aot.lib""C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\sdk\System.IO.Compression.Native.Aot.lib""advapi32.lib""bcrypt.lib""crypt32.lib""iphlpapi.lib""kernel32.lib""mswsock.lib""ncrypt.lib""normaliz.lib""ntdll.lib""ole32.lib""oleaut32.lib""secur32.lib""user32.lib""version.lib""ws2_32.lib"/NOLOGO /MANIFEST:NO/DEBUG/INCREMENTAL:NO/SUBSYSTEM:CONSOLE/ENTRY:wmainCRTStartup /NOEXP /NOIMPLIB/NATVIS:"C:\Users\Administrator\.nuget\packages\microsoft.dotnet.ilcompiler\8.0.1\build\NativeAOT.natvis"/NODEFAULTLIB:libucrt.lib/DEFAULTLIB:ucrt.lib/OPT:REF/OPT:ICF

/OUT参数即是指定输出的exe目录,这里可以自己修改,这里注意这个目录一定要存在。然后链接下。

link @link.rsp

同样需要注意它这个前面的@符号。这样就生成了可执行的二进制ConsoleApp17.exe文件。

结尾

这里需要两个注意点,一即是版本号的对应,二即是链接输出(//OUT)的目录。总体而言,.NET里面的AOT融合了C#和C++两个语言的特性,同时回归偏向于C++,即目标文件和链接可执行文件这一套。这里面的链接器(win/linux/macos各一套)是不开源的,其它全部开源。

往期精彩回顾

.NET9 Pre3 CLR的优化细节

.NET9 GC标记原理(超核技术)

.NET9异常(CLR)原理(顶阶技术


江湖评谈
记录,分享,自由。
 最新文章