Module initializers in C#
.net, c#, clr, clr-module-initializer
Solution
After eleven years, this is finally supported by the language in C#9
https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9#support-for-code-generators
Module initializers are methods that have the `ModuleInitializerAttribute` attribute attached to them. These methods will be called by the runtime before any other field access or method invocation within the entire module. A module initializer method:
Must be static
Must be parameterless
Must return void
Must not be a generic method
Must not be contained in a generic class
Must be accessible from the containing module
That last bullet point effectively means the method and its containing class must be internal or public. The method can't be a local function. For more information, see ModuleInitializer attribute.
Problem
Module initializers are a feature of the CLR that are not directly available in C# or VB.NET. They are global static methods named `.cctor` that are guaranteed to run before any other code (type initializers, static constructors) in an assembly are executed. I recently wanted to use this in a project and hacked together my own solution (console program/msbuild task) using Mono.Cecil, but I was wondering: Is there any way to trick the C# compiler into emitting module intializers? Any attributes (e.g. CompilerGenerated, SpecialName) or other trickery that could be used? Do the C# / VB.NET ever emit these initializers themselves for some purpose? From what I've seen they are used by managed C++ for some interop purposes, but I couldn't find any reference to them being used for other purposes. Any ideas?