如下所示創建一個簡單的asp.Net Web應用程序

在VS中生成解決方案之后,可以在項目的目錄下看到以下的文件:

當我們通過VS將網站發布出去之后,可以看到,最后生成的文件,如下圖所示:

我們可以發現,發布之后的項目文件夾內少了很多文件,其實這是VS將aspx頁面和一般處理程序以及Global文件等的后台文件都編譯成了一個dll文件,這個dll文件存放在bin文件夾內:

對這個程序集進行反編譯之后,可以看到我們寫的后台代碼都編譯到這個dll文件中了

這個是一般處理程序的ProcessRequest方法中的代碼,可以看到就是我們寫的源代碼:

此時項目文件夾內的幾個文件中只剩下一些簡單的聲明了,所有后台代碼都已經不見了:
Global文件:

一般處理程序:

aspx頁面:

然后我們通過以下這句代碼分別獲得頁面,一般處理程序以及Global編譯運行時所在的位置:
System.Reflection.Assembly.GetExecutingAssembly().Location
經過對比可以發現Global文件、一般處理程序、aspx后台代碼所在的程序集文件為同一個,而aspx前台頁面的代碼運行在另一個程序集中,以下為運行的結果:
Global和aspx頁面的前台與后台運行文件:

一般處理程序的后台代碼:

我們可以看到IIS運行網站時,實際將網站編譯之后的dll文件都放到了對應的Framework版本中的臨時文件夾中了
即在C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files下,網站中自己寫的后台代碼與類庫以及引用的類庫都被編譯到了這個臨時文件夾下當前項目所在的文件夾下的assembly文件下。
網站發布后的文件分布圖:

此時對比發布的網站根目錄下的bin文件夾里的dll文件和一般處理程序運行時所在的程序集,可以發現兩者是同一個文件:

此時如果刪除網站根目錄先的bin文件夾內的dll,然后再瀏覽頁面內,可以發現網站無法正常運行:

由上面的結果可以看出,雖然網站中已經存在了一個后台代碼的dll文件,但是網站實際運行的是系統文件夾中的那個dll文件,這個應該是直接從網站中拷貝過去的,它們的MD5值完全相同。
在這里可以推測,對於asp.Net應用程序來說,IIS只會編譯aspx頁面,一般處理程序,Global等文件,但是不會編譯其他的類文件,所有的類文件對IIS來說沒有用處,IIS只能使用編譯好的dll文件。
當網站正在運行時,無法刪除系統文件夾中的那個dll文件,顯示被IIS Worker Process占用,這個更加說明網站實際運行時使用的是這個dll文件

那么這個IIS Worker Process進程是什么呢,當我們結束當前網站對應的w3wp.exe進程時,系統文件夾中dll被成功刪除,這個可以說明,這個dll的調用者正是w3wp.exe這個進行,也說明了w3wp.exe是網站的工作進程。
當我們刪除系統文件夾中的dll文件時,再次訪問網站時會重新在系統文件夾中再次生成dll文件,而且第一次訪問時候報錯:

再次訪問就正常了

總結:
所以可以總結出,在IIS中運行asp.Net應用程序時,前台頁面的代碼是即時進行更新和編譯的,當我們修改前台代碼時,不需要重新編譯項目或者重新發布網站,在訪問網站時,IIS(或者.Net框架?)檢測到頁面發生了修改會幫我們重新編譯頁面,而在修改了后台代碼和其他的類文件的時候就需要我們手動對源代碼進行重新編譯了。
以上的內容都是針對Asp.Net應用程序來說的
對於Asp.Net網站來說發布網站時不會將頁面和一般處理程序以及其他一些代碼編譯成dll文件,只會將源文件和引用的一些類庫拷貝到網站的目錄下,對於解決方案中的其他類庫,也會在編譯好之后再拷貝到Bin文件夾中。
在這里可以推測,在asp.Net網站中,IIS或者其他的程序,在有人第一次訪問網站時,將App_Code文件里的源代碼編譯成了dll程序集

當用戶第一次請求時才進行即時編譯,編譯好的文件也是存在於系統文件夾下
如:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\7812c4be\73872874
此時生成的文件有以下這些:

直接在VS中調試時,情況與上述在IIS中運行類似,只是最后所在的文件目錄有所不同,而且會生成很多調試用的文件:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\website1\0e58724c\a4f149c8

總結:
Web應用程序和Web網站的前台頁面的代碼都是在網站運行時,被初次訪問時進行編譯的,而對於后台代碼和網站中的一些類文件來說,Web網站也會在網站第一次被訪問的時候被編譯,所以,Web網站中的后台代碼更改后不需要手動進行編譯,而在Web應用程序中,后台代碼和類文件都會在發布的時候進行編譯,編譯成功才能夠正常發布,所以對於Web應用程序,修改了后台代碼就必須重新編譯然后發布。
注:
網站編譯的臨時目錄可以在IIS中或者Web.config配置文件中進行配置,一下是IIS中的修改方法:
在服務器級或者網站級的".Net編譯"選項中修改編譯的臨時目錄,默認情況下臨時目錄為網站對應的.Net Framework的版本下的Temporary ASP.NET Files文件夾。

