一尘不染

C#中的模块初始化器

c#

模块初始化程序是CLR的功能,在C#或VB.NET中不直接可用。它们是命名的全局静态方法.cctor,可以保证在程序集中的任何其他代码(类型初始化器,静态构造函数)执行之前运行。我最近想在项目中使用它,并使用Mono.Cecil
将我自己的解决方案(控制台程序/ msbuild任务)合并在一起,但是我想知道:

  1. 有什么办法欺骗C#编译器发出模块初始化器?是否可以使用任何属性(例如CompilerGenerated,SpecialName)或其他技巧?

  2. C#/ VB.NET是否出于某种目的自己发出了这些初始化器?从我看到的内容来看,托管C ++将它们用于某些互操作目的,但是我找不到任何将它们用于其他目的的引用。有任何想法吗?


阅读 529

收藏
2020-05-19

共1个答案

一尘不染

不,没有办法在C#中发出它们,因为C#将所有内容放入类/结构中,并且模块初始化程序必须是全局的。

您将不得不使用其他工具来编写它们,最好是IL-Assembler。

至于第二个问题,我不得不承认我不知道,但是我从未见过C#生成的任何东西,而且我经常使用ILDasm,因此我认为它不会发出它们。

2020-05-19