App_Code檔案夾正好在Web應用程式根目錄下,其儲存所有應當作為應用程式的一部分動態編譯的類檔案。這些類檔案自 動連結到應用程式,而不需要在頁面中添加任何顯式指令或聲明來建立依賴性。App_Code檔案夾中放置的類檔案可以包含任何可識別的ASP.NET組件 ——自訂控制項、輔助類、build提供者、業務類、自訂提供者、HTTP處理常式等。
注意 在開發時,對App_Code檔案夾的更改會導致整個應用程式重新編譯。對於大型項目,這可能不受歡迎,而且很耗時。為此,鼓勵大家將代碼進行模組化處理 到不同的類庫中,按邏輯上相關的類集合進行組織。應用程式專用的輔助類大多應當放置在App_Code檔案夾中。
App_Code檔案夾中存放的所有類檔案應當使用相同的語言。如果類檔案使用兩種或多種語言編寫,則必須建立特定語言的子目錄,以包含用每種語言編寫的類。一旦根據語言群組織這些類檔案,就要在web.config檔案中為每個子目錄添加一個設定:
<compilation>
<codeSubDirectories>
<add directoryName="VBFolder" />
</codeSubDirectories>
</compilation>
重要的是,特定語言的子目錄應在web.config檔案中註冊,否則,不管它們屬於哪個檔案夾,App_Code檔案夾下 的所有檔案將被編譯成一個單獨的程式集。上述配置指令碼描述了這麼一種情況,即所有的C#檔案都放在App_Code檔案夾的根目錄下,而把幾個 Visual Basic .NET類檔案移入VBFolder目錄中。如果<codeSubDirectories>節中提到的目錄不存在,則會收到一個編譯錯誤提 示。
App_Code根資料夾中的檔案被編譯成App_Code_xxx.dll程式集,其中xxx是隨機產生的字元序列。一個 給定子目錄中的檔案將被編譯成一個名為App_SubCode_xxx_yyy.dll的動態建立的程式集,其中xxx指示子目錄的名稱,而yyy是一個 隨機字元序列。只有在應用程式根目錄中的web.config檔案中進行了設定,<codeSubDirectories>節才有效。
在App_Code目錄或任何其他子目錄中放置一個assemblyinfo.cs檔案,可以建立一個強命名的程式集。顯然,如果該檔案夾包含Visual Basic .NET檔案,那麼將使用assemblyinfo.vb檔案。程式集設定檔可以引用一個.snk檔案來儲存強式名稱的密鑰。
注意 給一個程式集設定一個強式名稱,首先必須獲得一個公開/私人金鑰組。通過使用強式名稱(Strong Name)工具(sn.exe),可以獲得這樣一個金鑰組。強式名稱工具是我們可以在.NET Framework的安裝路徑中發現的SDK binary之一。金鑰組檔案通常有一個.snk副檔名。可以將該檔案儲存到一個應用程式檔案夾中,並在assemblyinfo.cs檔案中引用它,如下所示:
[assembly: AssemblyKeyFileAttribute(@"yourKeyPair.snk")]
注意,Visual Basic .NET是在包含Visual Studio Solution的目錄中尋找密鑰檔案,而C#編譯器則在包含該binary的目錄中尋找密鑰檔案。據此可知,用此屬性調整我們使用的路徑,或者把密鑰檔案放在合適的檔案夾中。
在隨後發生的任何重建中,程式集的名稱將發生變化。同時,老的AppDomain請求一結束,就刪除老的程式集。
App_Code檔案夾並非只能包含類檔案。特別是,它可以包含並能自動地處理代表資料架構的XSD檔案。把一個XSD檔案 添加到該檔案夾中時,編譯器將把它解析成一個有類型的DataSet類,並將它添加到Application 領域中。在ASP.NET 1.x中,這一工作由Visual Studio .NET嚮導,使用一個命令列公用程式(xsd.exe)完成的。
注意 使用web.config檔案註冊一個組件(例如,一個自訂的伺服器控制項或一個自訂的HTTP處理常式)時,通常要求指定包含該代碼的程式集名稱。如 果該組件定義在App_Code檔案夾中,則應該用什麼名稱來指示程式集?在這種情況下,只是忽略程式集資訊,並規定完整的類名即可。如果沒有規定任何程 序集,則ASP.NET運行庫將試圖從任何已裝載的程式集中裝入該類,包括為App_Code檔案夾動態建立的程式集。
樣本程式:
1.用c#建立一個新的asp.net應用程式,這意味著整個WEB應用程式將主要採用C#語言。
2.修改設定檔,註冊可以使用多語言的目錄。
<compilation debug="true" >
<codeSubDirectories>
<add directoryName="VB_Code"/>
</codeSubDirectories>
</compilation>
3.添加vb類到指定的目錄下面。
Imports Microsoft.VisualBasic
Public Class VBObject
Public Function FormatString(ByVal inputStr As String)
Return "本字串來自VB.NET對象" & inputStr
End Function
End Class
4.添加c#類
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// CSharpObject 的摘要說明
/// </summary>
public class CSharpObject
{
public CSharpObject()
{
//
// TODO: 在此處添加建構函式邏輯
//
}
public string FormatString(string inputStr)
{
return "本字串來自C#對象" + inputStr;
}
}
4.建立一個頁面測試使用上面定義的兩個類
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
VBObject vbo = new VBObject();
Response.Write(vbo.FormatString("hello!!!")+ "<br>");
CSharpObject csharpo = new CSharpObject();
Response.Write(csharpo.FormatString("hello!!!") + "<br>");
}
}