Ответ 1
В файле .aspx есть тонкая разница, которую вы найдете в этих типах проектов.
Если вы посмотрите проект веб-сайта, вы увидите что-то вроде этого...
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
... где, поскольку проект веб-приложения будет иметь .aspx файлы с чем-то вроде этого...
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="WebApplication2._Default" %>
Обратите внимание, что первый имеет атрибут CodeFile, а второй - как атрибут CodeBehind. Именно здесь делается различие.
Атрибут CodeBehind НЕ используется во время выполнения - он там должен сообщать VS.NET, где находится код, а атрибут Inherits сообщает runtime, какой класс искать в двоичных файлах.
Атрибут CodeFile используется во время выполнения и используется aspnet_compiler.exe для генерации кода, а затем используется атрибут Inherits, как указано выше.
Подробнее об этих атрибутах смотрите здесь...
http://msdn.microsoft.com/en-us/library/ydy4x04a.aspx
Но чтобы ответить на ваш вопрос "как IIS знает?" ответ "это не так". ASP.NET знает.
Вы можете доказать, что это так: сделайте следующее:
- Создайте новое веб-приложение. Это будет включать Default.aspx и Default.aspx.cs.
-
Добавьте следующий код в Default.aspx.cs:
protected void Page_Load(object sender, EventArgs e) { Response.Write("hello"); }
-
Скомпилируйте проект, запустите его, см. текст "привет" появится в браузере.
-
Теперь измените код, чтобы он выглядел например, и сохраните файл .cs:
protected void Page_Load(object sender, EventArgs e) { Response.Write("goodbye"); }
-
НЕ СОСТАВЛЯЙТЕ. Обновите свой браузер. Вы все равно увидите "привет", потому что скомпилированный код все еще использует эту строку.
-
Теперь измените атрибут в Default.aspx от CodeBehind до CodeFile. Сохраните этот файл.
-
Обновите свой браузер. Вы увидите "прощай".
-
Измените "прощай" в своем коде на "Я верю!". Сохраните .aspx.cs, но не компилируйте.
-
Обновите свой браузер, см. "Я верю!" и танцую по комнате просветить: -)