用.NET语言编写的所有代码都编译为MSIL,但是只有使用MSIL才能直接执行特定的任务/操作吗?
让我们在MSIL中比C#,VB.NET,F#,j#或任何其他.NET语言更容易完成.
到目前为止我们有这个:
raise元素定义事件.main()方法作为.entrypoint.int和本机unsigned int类型.protected internal是fam 或 assem)<Module>类以定义全局函数或模块初始值设定项.是否可以在加载程序集时运行某些代码,而无需在加载代码中执行任何特定操作?我正在寻找的就像一个类型的静态构造函数.
例如:
程序集A不知道程序集B,但B确实知道A.如果加载B,程序集A需要知道关于B的某些事情.当程序集B由运行时加载(引用或显式)时,我想要执行一段调用程序集A中的方法的代码(静态方法或属性).
此问题的根本原因是序列化A中的类型时遇到的未知类型,该类型包含B中的类型,这些类型在编译时未知,因为使用了接口.
模块初始值设定项是CLR的一项功能,无法在C#或VB.NET中直接使用.它们是名为的全局静态方法.cctor,保证在执行程序集中的任何其他代码(类型初始化程序,静态构造函数)之前运行.我最近想在一个项目中使用它并使用Mono.Cecil 将我自己的解决方案(控制台程序/ msbuild任务)一起攻击,但我想知道:
有没有办法欺骗C#编译器发射模块初始化器?任何属性(例如CompilerGenerated,SpecialName)或其他可以使用的技巧?
C#/ VB.NET是否会出于某种目的自己发出这些初始化器?从我所看到的它们被托管C++用于某些互操作目的,但我找不到任何引用它们用于其他目的.有任何想法吗?