asp.net 網站中的共享程式碼資料夾
如果您的Web 應用程式包含要在多個頁面之間共用的程式碼,您可以將程式碼保存在Web 應用程式根目錄下的兩個特殊資料夾(Bin 資料夾和App_Code 資料夾)中的某個文件夾中。當您建立這些資料夾並在其中儲存特定類型的檔案時,ASP.NET 將使用特殊方式處理這些檔案。
Bin 資料夾可以在Bin 資料夾中儲存編譯的程序集,而Web 應用程式任意處的其他程式碼(如頁碼)會自動引用該資料夾。典型的範例是您為自訂類別編譯好的程式碼。您可以將編譯後的組件複製到Web 應用程式的Bin 資料夾中,這樣所有頁面都可以使用這個類別。
Bin 資料夾中的程式集無需註冊。只要.dll 檔案存在於Bin 資料夾中,ASP.NET 就可以識別它。如果您更改了.dll 文件,並將它的新版本寫入到了Bin 資料夾中,則ASP.NET 會偵測到更新,並對隨後的新頁請求使用新版本的.dll 檔案。
Bin 資料夾的安全性將編譯後的組件放入Bin 資料夾中會帶來安全風險。如果是您自己編寫和編譯的程式碼,那麼您就了解程式碼的功能。但是,您必須像對待任何可執行程式碼一樣來對待Bin 資料夾中已編譯的程式碼。在完成程式碼測試並確信已了解程式碼功能之前,請對已編譯的程式碼保持謹慎的態度。
請注意以下安全方面的知識,這些知識與是否將已編譯的程式碼放入Bin 資料夾有關:
Bin 資料夾中程序集的作用範圍為目前應用程式。因此,它們無法存取目前Web 應用程式以外的資源或呼叫目前Web 應用程式以外的程式碼。
執行時,程式集的存取等級由本機電腦上指定的信任等級決定。有關更多信息,請參閱ASP.NET 信任等級和策略文件。
如果您使用了諸如Visual Studio 這樣的設計器,那麼Bin 資料夾中的程式碼運行所在的上下文與執行時間不同。例如,程式碼可能以完全信任狀態運行。
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 資料夾中不允許使用使用者控制項。這包括單一檔案使用者控制項以及使用程式碼隱藏模型的使用者控制項。將使用者控制項置於App_Code 目錄中會導致不按使用者控制碼所要求的順序對其進行編譯,因此是不允許的。請注意,不需要將使用者控制項置於App_Code 資料夾中;因為處於應用程式中任何位置的頁都已經可以使用這些控制項。
推斷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 應用程式或電腦設定檔的compilation 元素中確定。
在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 會根據子資料夾中的檔案來推斷要使用的編譯器。
App_Code 資料夾的安全性
App_Code 資料夾中的程式碼存在的安全性問題基本上與Bin 資料夾中的程式碼存在的安全性問題相同- 程式碼都會在執行時間編譯成組件。比Bin 資料夾要好一些的是,您可以閱讀App_Code 資料夾中檔案的原始程式碼。但是,如果您不能完全理解程式碼,仍然會存在安全風險。因此,對待App_Code 資料夾中的原始程式碼的態度必須像對待基於相同的原始碼產生的已編譯程式碼一樣謹慎。
取自:http: //msdn2.microsoft.com/zh-cn/library/t990ks23 (VS.80).aspx
-