前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET8 ILC+Link原理剖析

.NET8 ILC+Link原理剖析

作者头像
江湖评谈
发布2024-05-11 16:51:52
800
发布2024-05-11 16:51:52
举报
文章被收录于专栏:天下风云天下风云

前言

先了解下概念,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,在目录:

代码语言:javascript
复制
C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.1\tools

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

代码语言:javascript
复制
-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:给定的程序集生成非托管入口点

例子

简单的例子:

代码语言:javascript
复制
private static void Main(string[] args)
{
   Console.WriteLine("你好,世界!!");
   Console.ReadLine();
}

csproj文件添加如下:

代码语言:javascript
复制
 <PublishAot>true</PublishAot>

csproj文件所在运行命令:

代码语言:javascript
复制
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文件如下:

代码语言:javascript
复制
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的包。

代码语言:javascript
复制
ilc.exe @ConsoleApp17.ilc.rsp

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

链接

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

代码语言:javascript
复制
E:\Visual Studio IDE>where link
E:\Visual Studio IDE\VC\Tools\MSVC\14.39.33519\bin\Hostx86\x86\link.exe

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

代码语言:javascript
复制
"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目录,这里可以自己修改,这里注意这个目录一定要存在。然后链接下。

代码语言:javascript
复制
link @link.rsp

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

结尾

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江湖评谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 例子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档