【发布时间】:2010-12-27 07:04:48
【问题描述】:
模块初始化器是 CLR 的一项功能,在 C# 或 VB.NET 中不直接可用。它们是名为.cctor 的全局静态方法,保证在执行程序集中的任何其他代码(类型初始化程序、静态构造函数)之前运行。我最近想在一个项目中使用它并 hacked together my own solution (console program/msbuild task) 使用 Mono.Cecil,但我想知道:
有什么办法可以诱使 C# 编译器发出模块初始化程序?是否有任何属性(例如 CompilerGenerated、SpecialName)或其他可以使用的技巧?
C#/VB.NET 是否会出于某种目的自己发出这些初始化程序?从我所看到的情况来看,托管 C++ 将它们用于某些互操作目的,但我找不到任何关于它们被用于其他目的的引用。有什么想法吗?
【问题讨论】:
-
您可以使用与Jon Skeet's Unconstrained Melody library 类似的技术,他用它来解决您不能在C# 中使用枚举约束的事实。他的解决方案是使用占位符属性来驱动一个后处理程序(用 C# 编写),该程序驱动 ilasm.exe 重新编写 IL 以正确实现 C# 中无法实现的东西。
标签: c# clr clr-module-initializer