MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как компилятор понимает, что первую функцию, которую нужно вызвать, будет именно Main()?"
Answer 1157711
Почему компилятор вызывает именно Main, а не DoSomething?
Компилятор не "вызывает" Main, он просто генерирует бинарник с метаданными на основе определенных правил. Эти правила сформулированы в ECMA 334, пункт 8.1:
8.1 Application startup
[...] A program compiled as an application shall contain at least one method qualifying as an entry point by satisfying the following requirements:
• It shall have the name Main.
• It shall be static.
• It shall not be generic.
• It shall be declared in a non-generic type. If the type declaring the method is a nested type, none of its enclosing types may be generic.
• It shall not have the async modifier.
• The return type shall be void or int.
• It shall not be a partial method (§15.6.9) without an implementation.
• The formal parameter list shall either be empty, or have a single value parameter of type string[].
If more than one method qualifying as an entry point is declared within a program, an external mechanism may be used to specify which method is deemed to be the actual entry point for the application.
(Спецификация еще не обновлена под новую версию, которая разрешает async Main, но в остальном тут все актуально)
То есть, имя метода Main является "магическим" значением, а вот из какого типа брать этот метод, если их несколько, задается внешним механизмом - конкретно, это параметр -main.
Какой метод запускать во время выполнения, решает CLR, а вот она уже не оперирует магическими значениями, а считывает метаданные четко заданного формата.
Main в таблице методов как-то по-особенному отмечена?
Если бы это было так, определение точки входа требовало от CLR линейного поиска по таблице методов. На деле, чтобы эту операцию можно было выполнить быстрее, это реализовано несколько по другому - в заголовке CLI хранится значение EntryPointToken, которое является закодированным индексом точки входа в таблице MethodDef. Это определено ECMA 335, пункт II.25.3.3:
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.