Выполнение кода перед Main¶
Main
Метод Main — это точка входа в приложение C#. При запуске приложения метод Main вызывается первым.1
На самом деле метод Main может быть не первым методом сборки, который будет выполняться при запуске приложения. Существуют различные методы, которые могут выполняться перед методом Main.
Статический конструктор¶
Статический конструктор используется для инициализации любых статических данных или для выполнения определённого действия, которое необходимо выполнить только один раз. Он вызывается автоматически перед созданием первого экземпляра или обращением к любым статическим элементам. Поэтому статический конструктор вызовется перед методом Main.
class Program
{
static Program() =>
Console.WriteLine("Program.cctor");
static void Main() =>
Console.WriteLine("Hello, World!");
}
Инициализаторы модулей¶
Инициализаторы модулей позволяют библиотекам выполнять однократную инициализацию при загрузке без необходимости явного вызова пользователем чего-либо. Когда среда выполнения загружает модуль (DLL), она вызывает методы инициализации модуля перед выполнением любого кода из этого модуля.
using System.Runtime.CompilerServices;
class Initializer
{
// Статический конструктор выполняется
// перед инициализаторами модуля
static Initializer()
=> Console.WriteLine("Init.cctor");
[ModuleInitializer]
public static void Initialize1() =>
Console.WriteLine("Module Init 1");
[ModuleInitializer]
public static void Initialize2() =>
Console.WriteLine("Module Init 2");
}
Стартап хуки¶
Переменная среды DOTNET_STARTUP_HOOKS может использоваться для указания списка управляемых сборок, содержащих тип StartupHook с публичным статическим методом Initialize():
class StartupHook
{
static StartupHook() =>
Console.WriteLine("StartupHook.cctor");
// Запустите приложение с переменной среды
// DOTNET_STARTUP_HOOKS=<полный путь к сборке с этим классом>
public static void Initialize() =>
Console.WriteLine("Startup hook");
}
Каждый из этих методов будет вызываться в указанном порядке перед точкой входа Main:
Ссылки¶
https://www.meziantou.net/executing-code-before-main-in-dotnet.htm
Дата создания : 31 июля 2022 г.