惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
C
Cyber Attacks, Cyber Crime and Cyber Security
G
GRAHAM CLULEY
T
Tenable Blog
T
Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
Intezer
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
Security Latest
Security Latest
P
Privacy & Cybersecurity Law Blog
Google Online Security Blog
Google Online Security Blog
SecWiki News
SecWiki News
P
Palo Alto Networks Blog
TaoSecurity Blog
TaoSecurity Blog
Webroot Blog
Webroot Blog
Spread Privacy
Spread Privacy
O
OpenAI News
The Last Watchdog
The Last Watchdog
P
Proofpoint News Feed
C
Check Point Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
人人都是产品经理
人人都是产品经理
S
Security @ Cisco Blogs
Scott Helme
Scott Helme
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
月光博客
月光博客
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
T
Troy Hunt's Blog
W
WeLiveSecurity
GbyAI
GbyAI
N
News | PayPal Newsroom
Y
Y Combinator Blog
C
Cisco Blogs
H
Help Net Security
The GitHub Blog
The GitHub Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 【当耐特】
Jina AI
Jina AI
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
云风的 BLOG
云风的 BLOG
小众软件
小众软件
N
News and Events Feed by Topic

博客园 - Charltsing

C# 预处理器指令语言 - 完整语法速查 LoggerMessage:编写高性能的 .NET 日志 PDFImageViewer v2.1 PDF查看图像和无损导出工具,一键转换单图PDF为JBig2黑白PDF。兼谈PDF内嵌图像。 PDF的色彩空间 25 个使用.NET 10 的性能技巧 PDFontFixer v1.5 免费版,解决PDF文档复制粘贴乱码的问题,修复PDF文档字体的Unicode映射。 为什么 PDF 编辑这么难? Unicode、UTF-8、UTF-16 如何直接编辑Github的Readme.md文件 自动导入工程项目属性,Directory.Build.props 和 Directory.Build.targets 新版 C# 高效率编程指南 C# 内联数组(Inline Array):高性能数组的新选择 如何在 .NET 中使用 SIMD .NET异步编程进阶:从语法糖到高性能架构的核心突破 C# 中的安全零拷贝 使用UnsafeAccessor 访问私有字段 C# 12与.NET 8实战指南:20个提升代码质量的最佳实践 ECMA-335 CLI 规范附录 C#中避免GC压力和提高性能的8种技术 函数内联 硬件内在函数 官方:oPDF v2.1免费版,专业的PDF水印分析处理工具,无损去除水印,通杀八类PDF水印。它是PDFCommander 万能PDF水印删除工具的升级版。 C#自动引用Debug | Release版本的dll
C# Net9的模块初始化器(Module Initializer)
Charltsing · 2025-10-03 · via 博客园 - Charltsing

Module Initializer 是为了让库/框架在程序集加载时,以 “CLR 保证的、只运行一次的、不依赖类型访问的” 方式执行初始化逻辑,从而避免静态构造函数的副作用和性能问题。

为什么需要 Module Initializer?

1. 静态构造函数的问题

  • 触发时机不确定:CLR 保证在第一次访问类型前调用静态构造函数,但 你无法精确控制它什么时候运行。
  • 性能开销:CLR 对静态构造函数的类型会加锁,防止并发初始化,这会带来性能损耗。
  • 不能跨类型共享初始化逻辑:每个有静态构造函数的类都要单独处理,无法集中初始化。

2. 模块初始化器的优势

  • 只运行一次:在程序集加载时 由 CLR 自动调用一次,不依赖任何类型访问。
  • 无类型访问开销:不需要触发某个类型的静态构造函数来“顺便”初始化。
  • AOT 兼容的初始化逻逻辑
using System.Runtime.CompilerServices;

class Program
{
    static void Main()
    {
        Console.WriteLine("Main");
    }
}

class Init
{
    [ModuleInitializer]
    public static void Initialize()
    {
        Console.WriteLine("Module Initializer runs before Main!");
    }
}

输出:

Module Initializer runs before Main!
Main
 

在 NativeAOT 场景里,所有必须在运行时“反射”才能完成的事情都必须提前在编译期做完。Module Initializer 就是“把编译期算好的东西在程序一启动就塞进运行时”的唯一可靠入口——它跑在 任何用户代码、任何泛型实例化、任何反射调用之前,而且 不需要触发某个类型的静态构造,因此不会引入 AOT 禁止的动态路径。

NativeAOT 的底线是 “运行时不能做任何‘发现’工作”。所有发现必须在编译期完成,而 发现结果塞进运行时的唯一零成本窗口就是 Module Initializer;
因此只要你在 AOT 模式下看到“编译期源生成器 + 运行时注册表/函数指针/缓存” 这种组合,背后几乎一定藏着一个 [ModuleInitializer]——它已经成了 AOT 生态的隐形基础设施。