C#:
class Initializer
{
// The static ctor runs before the module initializer
static Initializer() => Console.WriteLine("Initializer.cctor");
[ModuleInitializer]
public static void Initialize1() => Console.WriteLine("Module Initializer 1");
[ModuleInitializer]
public static void Initialize2() => Console.WriteLine("Module Initializer 2");
}
class StartupHook
{
static StartupHook() => Console.WriteLine("StartupHook.cctor");
// Start the application with the environment variable
// DOTNET_STARTUP_HOOKS=myapp.dll (use full path to the assembly)
public static void Initialize() => Console.WriteLine("Startup hook");
}
class Program
{
static void Main() => Console.WriteLine("Hello, World!");
}

src - https://www.meziantou.net/executing-code-before-main-in-dotnet.htm