學習於:http://msdn.microsoft.com/zh-cn/library/t990ks23(v=vs.100).aspx
如果網站項目包括要由多個頁共用程式碼,可以將這些代碼儲存在 Web 應用程式根目錄下的兩個特殊檔案夾的某個檔案夾中:編譯過的代碼(.DLL 檔案)放入 Bin 檔案夾,原始碼放入 App_Code 檔案夾。 當您建立這些檔案夾並在其中儲存特定類型的檔案時,ASP.NET 將使用特殊方式處理這些檔案。
1. Bin檔案夾
可以在 Bin 檔案夾中儲存編譯的程式集(.DLL 檔案),並且 Web 應用程式任意處的其他代碼(如頁代碼)會自動引用該檔案夾。典型的樣本是您為自訂類編譯好的代碼。您可以將編譯後的程式集複製到 Web 應用程式的 Bin 檔案夾中,這樣所有頁都可以使用這個類。
Bin 檔案夾中的程式集無需註冊。只要 .DLL 檔案存在於 Bin 檔案夾中,ASP.NET 就可以識別它。如果您更改了 .DLL 檔案,並將它的新版本寫入到了 Bin 檔案夾中,則 ASP.NET 會檢測到更新,並對隨後的新頁請求使用新版本的 .DLL 檔案。
注意:Bin 檔案夾用於Managed 程式碼程式集,而不用於機器碼(Unmanaged 程式碼)程式集。
1.1 Bin檔案夾的安全性
將編譯後的程式集放入 Bin 檔案夾中會帶來安全風險。如果是您自己編寫和編譯的代碼,那麼您瞭解代碼的功能。但是,您必須像對待任何可執行代碼一樣來對待 Bin 檔案夾中已編譯的代碼。在完成代碼測試並確信已瞭解代碼功能之前,要對已編譯的代碼保持謹慎的態度。
請注意以下安全方面的知識,這些知識與是否將已編譯的代碼放入 Bin 檔案夾有關:
-
Bin 檔案夾中程式集的作用範圍為當前應用程式。因此,它們無法訪問當前 Web 應用程式之外的資源或調用當前 Web 應用程式之外的代碼。
-
運行時,程式集的存取層級由本機電腦上指定的信任層級確定。
-
當在 Visual Studio 中運行項目時,Bin 檔案夾中的代碼運行所在的上下文與運行時不同。Visual Studio 程式開發伺服器採用登入的標識運行。如果以管理員身份登入,則代碼會採用管理員權限運行。但是,當部署網站時,代碼通常不會採用管理員權限運行。因此應在部署項目之前使用 IIS 伺服器進行測試,以確保不會在生產中出現安全錯誤。
2. App_Code 檔案夾
在網站項目中,可以在 App_Code 檔案夾中儲存原始碼,在運行時將會自動對這些代碼進行編譯。Web 應用程式中的其他任何代碼都可以訪問產生的程式集。因此,App_Code 檔案夾的工作方式與 Bin 檔案夾很類似,不同之處是您可以在其中儲存原始碼而非已編譯的代碼。App_Code 檔案夾及其在 ASP.NET Web 應用程式中的特殊地位使您可以建立自訂類和其他僅原始碼檔案,並在 Web 應用程式中使用它們而不必單獨對它們進行編譯。
App_Code 檔案夾可以包含以傳統類檔案(即帶有 .vb、.cs 等副檔名的檔案)的形式編寫的原始碼檔案。但是,它也可以包含並非明確顯示出由某一特定程式設計語言編寫的檔案。例如 .wsdl(Web 服務描述語言)檔案和 XML 結構描述 (.xsd) 檔案。ASP.NET 可以將這些檔案編譯成程式集。
根據您的需要,App_Code 檔案夾可以包含任意數量的檔案和子檔案夾。您可以採用任何您認為方便的方式組織原始碼,ASP.NET 仍會將所有代碼編譯成單個程式集,並且 Web 應用程式任意處的其他代碼都可以訪問該程式集。
注意:
App_Code 檔案夾中不允許存在使用者控制項(ascx 檔案)。這包括單檔案使用者控制項和使用程式碼後置模型的使用者控制項。將使用者控制項置於 App_Code 目錄中會導致不按使用者控制項代碼所要求的順序對其進行編譯,因此是不允許的。(在任何情況下,都不需要將使用者控制項置於 App_Code 檔案夾中;因為處於應用程式中任何位置的頁都已經可以使用這些控制項。)
2.1 推斷 App_Code 檔案夾的程式設計語言
App_Code 檔案夾並未顯式標記為包含以任何一種程式設計語言編寫的檔案。相反,ASP.NET 是根據 App_Code 檔案夾所包含的檔案來推斷應為 App_Code 檔案夾調用哪一種編譯器。如果 App_Code 檔案夾包含 .vb 檔案,則 ASP.NET 使用 Visual Basic 編譯器;如果包含 .cs 檔案,則 ASP.NET 使用 C# 編譯器,以此類推。
如果 App_Code 檔案夾只包含並未明確表明程式設計語言的檔案(如 .wsdl 檔案),則 ASP.NET 將使用 Web 應用程式的預設編譯器,預設編譯器在應用程式 Web.config 檔案或電腦層級 Web.config 檔案的 compilation 元素中確定。編譯器是指定的產生提供者,產生提供者在 extension 元素中為每個副檔名指定。
2.2 在 App_Code 檔案夾中使用多種程式設計語言
因為 App_Code 檔案夾中的原始碼要編譯成單個程式集,所以 App_Code 檔案夾中的所有檔案必須使用相同的程式設計語言編寫。例如,App_Code 檔案夾不能同時包含採用 Visual Basic 和 C# 編寫的原始碼。
但是,您可以對 Web 應用程式進行配置,使其將 App_Code 檔案夾的子檔案夾作為獨立的可編譯單元處理。這樣,每一個檔案夾就可以包含以不同程式設計語言編寫的原始碼。通過在 Web.config 檔案的 codeSubDirectories 元素中建立一個 compilation 元素,然後添加一個對子檔案夾的引用,即可指定該配置。下面的樣本闡釋如何對名為 VBCode 和 CSCode 的子檔案夾進行配置,使其編譯成不同的程式集:
<compilation debug="false"> <codeSubDirectories> <add directoryName="VBCode" /> <add directoryName="CSCode" /> </codeSubDirectories></compilation>
對 VBCode 和 CSCode 子檔案夾的引用並不需要包括任何有關子檔案夾中所包含的程式設計語言的資訊。就像對待 App_Code 檔案夾本身一樣,ASP.NET 會根據子檔案夾中的檔案來推斷要使用的編譯器。
2.3 App_Code 檔案夾的安全性
App_Code 檔案夾中的代碼存在的安全問題基本上與 Bin 檔案夾中的代碼存在的安全問題相同 - 代碼都會在運行時編譯成程式集。比 Bin 檔案夾要好一些的是,您可以閱讀 App_Code 檔案夾中檔案的原始碼。但是,如果您不能完全理解代碼,仍然會存在安全風險。因此,對待 App_Code 檔案夾中的原始碼的態度必須像對待基於同樣的原始碼產生的已編譯代碼一樣謹慎。