https://learn.microsoft.com/en-us/dotnet/fundamentals/文档阅读。
-
Assemblies in .NET
- Fundamental coding components
- Base types overview
- Runtime libraries
- Dependency injection
- Overview
- DI是一种软件模式,可以实现IoC
- .NET框架的内置有DI的支持
- DI要解决的痛点是:“我想要的只是标类提供的服务,为什么我却要负责例现化这个标类?”
- DI解决此痛点的办法是
- 通过注册,把服务映射到接口或者抽象的标类
- 相关接口有IServiceProvider、IServiceCollection、BuildServiceProvider
- 通过注入,把服务提供给使用者
- 通过注册,把服务映射到接口或者抽象的标类
- (具体例子略)
-
Multiple constructor discovery rules
- 如果一个类型有多个构造器,那么DI可以提供最多参数的那个构造器将被选用
- 如果同时有多个可选的构造器,那么DI会抛出异常
-
Register groups of services with extension methods
- 成例上,使用
Add{GROUP_NAME}
扩展方法来注册一组服务,例如AddOptions
。
- 成例上,使用
-
Framework-provided services
ConfigureServices
方法注册App将会用到的服务,传进来的IServiceCollection提供有.NET框架提供的许多服务
-
Service lifetimes
- (暂停)
- Overview
- Dependency injection
- Deployment models
- Overview
- 有两种基本的发布形式:自包含,从框架
- dotnet publish执行
-r <RID>
则是自包含建构,如果要从框架,则是-r <RID> --self-contained false
-
Produce an executable
-
Produce a cross-platform binary
- 从框架的形式发布dll文件
-
Publish framework-dependent
-
Publish self-contained
-
Publish with ReadyToRun images
- Self-contained deployment runtime roll forward
- (过)
- Single-file deployment and executable
- (略)
- ReadyToRun Compilation
- ReadyToRun(R2R)是AOT的一种形式,可以改进启动性能,主要是减少了JIT的耗费,代价是生成物体积更大
- 只在特定环境(RID)下可用
- Linux x64或Windows x64
- 需要在发布的时候将PublishReadyToRun辖属设置为true,有以下办法达成
- 命令行
dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true
- 工程辖属
<PublishReadyToRun>true</PublishReadyToRun>
- 命令行
-
Impact of using the ReadyToRun feature
- 以静态尺寸换动态消耗,影响难以评估
-
Interaction with tiered compilation(略)
-
How is the set of precompiled assemblies chosen?
- 通过在ItemGroup里面指定
<PublishReadyToRunExclude Include="Contoso.Example.dll" />
,可以将所列dll移除R2R的作用范围
- 通过在ItemGroup里面指定
-
How is the set of methods to precompile chosen?
- 无法完全组织JIT的运行
-
Symbol generation for use with profilers
- 通过在PropertyGroup里面指定
<PublishReadyToRunEmitSymbols>true</PublishReadyToRunEmitSymbols>
可以生成剖析器所需的符号
- 通过在PropertyGroup里面指定
-
Composite ReadyToRun
- .NET 6开始支持符合R2R编译,将需要一起发布的装备件一齐处理
- .NET 6中只支持自包含的部署方式
- 生成物尺寸会进一步增加,且编译过程更长
- 需要设置PublishReadyToRunComposite辖属开启
- .NET 6开始支持符合R2R编译,将需要一起发布的装备件一齐处理
-
Cross platform/architecture restrictions
- 在表格中列出所有支持目标
- Native AOT deployment model
- Overview
- ASP.NET Core尚不支持Native AOT,目前仅支持控制台应用。
- Native AOT将程序编译成IL,然后在发布时编译成原生代码,而不是在运行的时候使用JIT
- 和自包含的应用一样,Native AOT对标特定环境,比如Linux x64或者Windows x64
- Native AOT目前有一些限制
- 无法在运行时生成代码
- .NET 7中主要支持控制台类型的应用,仅有少数一些料库完全兼容AOT
-
Prerequisites
- Windows上许哟VS2022以及C++工作载具
- Linux上需要clang等
-
Publish Native AOT - CLI
- 工程文件中添加
<PublishAot>true</PublishAot>
- 或
donet publish -r <RID>
- 例子:
dotnet publish -r win-x64 -c Release
- 例子:
dotnet publish -r linux-arm64 -c Release
- 例子:
- 样板工程:https://github.com/dotnet/samples/tree/main/core/nativeaot
-
Native Debug Information
- 调试信息随平台,Windows是在单独的文件,比如
.pdb
中提供,linux是和可执行文件放置在一起 - 可以在PropertyGroup内将
<StripSymbols>true</StripSymbols>
来摘除调试信息
- 调试信息随平台,Windows是在单独的文件,比如
- 工程文件中添加
-
Limitations of Native AOT deployment
- 存在根本上的限制,以及兼容性异诉
- 不支持动态加载(比如Assembly.LoadFile)
- 不支持运行时代码生成(比如system.Reflection.Emit)
- 不支持C++/CLI
- 不支持内置的COM(Windows专属异诉)
- 需要裁剪,会带来限制
- 意味着要编译成单文件,存在不兼容性
- 需要纳入运行料库,增大尺寸
- .NET7中的AOT存在额外的限制
- 仅限于控制台类型,不支持ASP.NET Core
- 不是所有的运行料库都是AOT兼容
- 诊断支持受限(调试以及剖析)
- 存在根本上的限制,以及兼容性异诉
-
Build native libraries
- AOT意味着.NET标类料库,可以被非.NET编程语言使用
- AOT发行的类库所暴露的方法,会注释成带有非空EntryPoint域属的UnmanagedCallersOnlyAttribute
-
Platform/architecture restrictions
- Windows x64, Arm64
- Linux x64, Arm64
-
Recommended content
- (略)
- Overview
- Overview
- Runtime libraries
- Resources in .NET apps
- Overview
- 一份资源是任意的不可执行的数据,逻辑上随着应用一起部署。
- 数据格式可以是字符串、图片、持久化的对象,等等
- .NET提供全面的支持,用以资源的创建和本地化,并提供一个简单的模型来打包和部署本地化资源
- 一份资源是任意的不可执行的数据,逻辑上随着应用一起部署。
-
Create and localize resources
- 资源可以是.txt或者.resx格式存储,通过resgen.exe来编译成二进制的.resoures格式,然后可以嵌入到应用的可执行文件中。
- 可以为特定的culture本地化应用的资源,同时可以指定一个culture作为中性的或者保底
- 中性资源一般嵌入应用的可执行文件,其他本地化资源以独立的外围(satellite)装配件形式存在
-
Package and deploy resources
- 外围装配件包含单个culture(语言习惯)的资源
- 如果不在主装配件中提供默认资源,查找保底资源的时候会抛出异常
-
Retrieve resources
- 运行的时候,应用会在每个线程基础上加载本地化的资源,culture通过CultureInfo.CurrentUICulture指定
- 此辖属的值的决定过程(过)
- 然后就可以通过System.Resources.ResourceManager标类来获取资源
- System.Resources纳名空间中还包括其他的类型,可以用于获取资源
- ResourceReader标类,可以枚举.resources
- ResXResourceReader标类,可以从.resx获取资源
- ResourceSet标类,查资源,但是不看保底
- ResXResourceSet,加载所有XML资源文件到内存
- 运行的时候,应用会在每个线程基础上加载本地化的资源,culture通过CultureInfo.CurrentUICulture指定
- Overview
- Resources in .NET apps
其他
- https://www.attosol.com/insert-any-binary-file-in-c-assembly-and-extract-it-at-runtime/
- https://learn.microsoft.com/en-us/previous-versions/dotnet/articles/ms950960(v=msdn.10)?redirectedfrom=MSDN
hez2010
(底线)