https://learn.microsoft.com/en-us/dotnet/fundamentals/文档阅读。

  • Assemblies in .NET

  • Fundamental coding components
  • 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

          • (暂停)
  • 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的作用范围
      • How is the set of methods to precompile chosen?

        • 无法完全组织JIT的运行
      • Symbol generation for use with profilers

        • 通过在PropertyGroup里面指定 <PublishReadyToRunEmitSymbols>true</PublishReadyToRunEmitSymbols>可以生成剖析器所需的符号
      • Composite ReadyToRun

        • .NET 6开始支持符合R2R编译,将需要一起发布的装备件一齐处理
          • .NET 6中只支持自包含的部署方式
        • 生成物尺寸会进一步增加,且编译过程更长
        • 需要设置PublishReadyToRunComposite辖属开启
      • 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>来摘除调试信息
        • 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
          • (略)
  • 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资源文件到内存

其他

hez2010

(底线)