Что происходит «под капотом», так это то, что каждая страница ASP.NET компилируется в класс .NET, как и любой другой. Элементы управления (ASCX) компилируются одинаково. Существует компилятор для разметки ASP.NET так же, как есть компилятор для c # и VB.NET - вы можете думать о разметке ASP.NET как о «еще одном» языке, который компилируется в нативный MSIL.
Собственная разметка ASP.NET обрабатывается PageParser . Вы можете заметить, что у этого класса есть один интересный и очень полезный метод - GetCompiledPageInstance . Как и подразумевается, он компилирует страницу в собственный класс .NET. Это может быть переопределено (например, вы можете создать собственную разметку и написать свой собственный анализатор / компилятор). Spark - популярная альтернатива разметке ASP.NET.
Каждый класс в конечном счете наследуется от Page или Control . Оба этих класса имеют методы Render (), которые в конце выполнения классом своих пользовательских функций записывают HTML в выходной поток.
Большая разница в том, что компиляция часто происходит в разное время, чем код на c # или VB.NET. Это не столько техническое требование, сколько функция, позволяющая отделить язык представления .NET от функционального языка .NET. Страницы ASPX и ASCX компилируются средой выполнения ASP.NET, когда они запрашиваются в контексте веб-сервера. Затем скомпилированные сборки сохраняются в памяти до тех пор, пока а) веб-приложение не закроется или б) не будет обнаружено изменение файловой системы в одном из файлов ASPX, что приведет к перекомпиляции.
Можно скомпилировать ваши страницы ASPX вместе с вашим c # / VB.NET / чем угодно, так что вы можете развернуть все приложение как одну сборку. Это имеет два преимущества - первое - очевидная простота развертывания одной DLL. Во-вторых, он устраняет время ожидания LOOOONG , которое так часто сопровождает «первое попадание» в веб-приложение ASP.NET. Поскольку все страницы предварительно скомпилированы, сборка просто должна быть загружена в память по первому запросу, а не компилировать каждый файл.