Ein*_*son 23 c# clr clr-module-initializer
模块初始值设定项是CLR的一项功能,无法在C#或VB.NET中直接使用.它们是名为的全局静态方法.cctor,保证在执行程序集中的任何其他代码(类型初始化程序,静态构造函数)之前运行.我最近想在一个项目中使用它并使用Mono.Cecil 将我自己的解决方案(控制台程序/ msbuild任务)一起攻击,但我想知道:
有没有办法欺骗C#编译器发射模块初始化器?任何属性(例如CompilerGenerated,SpecialName)或其他可以使用的技巧?
C#/ VB.NET是否会出于某种目的自己发出这些初始化器?从我所看到的它们被托管C++用于某些互操作目的,但我找不到任何引用它们用于其他目的.有任何想法吗?
Dav*_*oth 10
查看由Simon Cropp撰写的令人敬畏的开源IL-Weaver项目" fody " 的模块初始化程序插件:https://github.com/fody/moduleinit
它允许您指定一个方法,该方法将由fody转换为汇编初始值设定项:
public static class ModuleInitializer
{
public static void Initialize()
{
//Init code
}
}
Run Code Online (Sandbox Code Playgroud)
得到这个:
static <Module>()
{
ModuleInitializer.Initialize();
}
Run Code Online (Sandbox Code Playgroud)
不,没有办法在C#中发出它们,因为C#将所有内容放在类/结构中,模块初始化器需要是全局的.
您将不得不使用不同的工具来编写它们,最好是IL-Assembler.
关于第二个问题,我不得不承认我不知道,但我从未见过任何由C#生成的,而且我经常使用ILDasm,所以我认为它不会发出它们.
时隔十一年,这个终于被C#9的语言支持了
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9#support-for-code-generators
| 归档时间: |
|
| 查看次数: |
8654 次 |
| 最近记录: |