TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.76K subscribers
Post #1405 1.96K
День 1139. #ЗаметкиНаПолях
Выполнение Кода Перед Main
Вообще, я не любитель подобных извращений. Но чисто ради лулзов иногда интересно узнать, что так можно.

Согласно документации, «Метод Main — это точка входа в приложение C#. При запуске приложения метод Main вызывается первым.» На самом деле метод Main может быть не первым методом сборки, который будет выполняться при запуске приложения. Существуют различные методы, которые могут выполняться перед методом Main.

1. Статический конструктор
Статический конструктор используется для инициализации любых статических данных или для выполнения определённого действия, которое необходимо выполнить только один раз. Он вызывается автоматически перед созданием первого экземпляра или обращением к любым статическим элементам. Поэтому статический конструктор вызовется перед методом Main.
class Program
{
static Program() =>
Console.WriteLine("Program.cctor");
static void Main() =>
Console.WriteLine("Hello, World!");
}

2. Инициализаторы модулей
Инициализаторы модулей позволяют библиотекам выполнять однократную инициализацию при загрузке без необходимости явного вызова пользователем чего-либо. Когда среда выполнения загружает модуль (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");
}

3. Стартап хуки
Переменная среды 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:
Init.cctor
Module Init 1
Module Init 2
StartupHook.cctor
Startup hook
program.cctor
Hello, World!

Источник: https://www.meziantou.net/executing-code-before-main-in-dotnet.htm
  • 👍 9
More from @netdeveloperdiary
  1. Oct 15, 2026Post #3374
  2. Oct 14, 2026Post #3373
  3. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  4. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  5. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  6. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →