ResourceManager
ResourceManager 類別在 Run Time 時很容易就能存取文化特性正確的資源。ResourceManager 可以管理有特殊根目錄名稱的通用來源中的多種資源。多種類別建構函式可以支援不同案例,包含從組件及資源檔案中擷取資源。另一個靜態 (Static) 方法可以從影像等的獨立資源檔案中擷取資源。預設實作會載入所有資源名稱,並在需要時載入數值,並且存檔備用。這種方法不載入所有的資源,使用的記憶體比 ResourceSet 類別 (將在本節後面詳述) 少,但是最新擷取特定資源時,可能需要較長的時間。此外,預設的 ResourceManager 實作,支援物件序列化。最後,如果沒有特定的當地語系化資源,ResourceManager 物件可以對獨立地區和中性文化特性,提供回溯資源查詢。
您已經看過簡單的機制 - 使用 ResourceReader - 如何列舉資源。接著我們要用強大的 ResourceManager 來做同樣的事情。
清單 4a. 使用 ResourceManager 為資源命名 (ResWrite.cs)
...
ResourceManager rm = ResourceManager.
CreateFileBasedResourceManager("sample", ".", null);
Console.WriteLine(rm.GetString("test1"));
Console.WriteLine(rm.GetString("test2"));
Console.WriteLine(rm.GetString("test3"));
Console.WriteLine(rm.GetString("test4"));
Console.WriteLine(rm.GetObject("test5").ToString());
...
清單 4b. 使用 ResourceManager 為資源命名 (ResWrite.vb)
...
Dim rm As ResourceManager = ResourceManager.
CreateFileBasedResourceManager ("sample", ".", Nothing)
Console.WriteLine(rm.GetString("test1"))
Console.WriteLine(rm.GetString("test2"))
Console.WriteLine(rm.GetString("test3"))
Console.WriteLine(rm.GetString("test4"))
Console.WriteLine(rm.GetObject("test5").ToString())
...
首先要注意的是靜態 CreateFileBasedResourceManager 方法,它有三個引數:檔案、位置以及是否使用非預設 ResourceSet (程式碼假設位置在應用程式的基本目錄 AppBase 中)。另一個要注意的是使用 ResourceManager 類別的 GetString 方法,很容易擷取字串資源。
您也可以使用 GetObject 方法,擷取影像資源。上一個範例只寫出資源名稱值,但是下二行程式碼 (取自 Graphic.cs 範例檔案) 顯示如何使用這個方法來擷取及顯示圖形影像:
rm = new ResourceManager("Images", this.GetType().Assembly);
pictureBox1.Image = (System.Drawing.Image)rm.GetObject("flag");
這是 Graphic.vb 範例檔案中同等的 Visual Basic:
rm = New ResourceManager("Images", Me.GetType().Assembly)
pictureBox1.Image = CType(rm.GetObject("flag"), System.Drawing.Image)
前二個陳述式從 Images 資源檔案中載入 flag 物件,再將它轉換成 Image 型別,並且把結果指定到圖片方塊的 Image 屬性。當然,實際載入的內容,視使用的文化特性而定。中性文化特性資源來自編譯器選項的指定內容,請參閱下面:
.../res:Images.resources,Images.resources...
在這個特殊案例中,編譯器選項嵌入了 Un.jpg 檔案。其他文化特性的點陣圖,會在建置時嵌入到對應的附屬組件中。
ResourceManager 可以使用任何的可序列化資料,也就是有標示 Serializable 屬性以及支援 ISerializable 介面的類別。內建型別包含 Image 型別 (和 Bitmap、Icon、Cursor 和 Metafile 衍生型別) 和字串型別。請注意,ResourceManager 字串參數區分大小寫,也就是說檔案名稱和資源金鑰全都區分大小寫。
這些檔案可能在子目錄或 .resources 檔案中,也可能被封裝在組件中。若要尋找組件中的資源,ResourceManager 先取得執行的組件名稱,然後附加「.resources」及它自己的 Major.Minor 版本號碼,再加上目前的國別和目前執行的組件的簽章金鑰雜湊,指示組件快取尋找這個組件。有關組件快取繫結要求的追蹤工具的詳細資訊,請參閱附錄 B:資源工具中<組件繫結記錄檔檢視工具 (FusLogVW)>的說明文件。
**注意 **如果您選擇在個別檔案中實作獨立又鬆散的資源並且執行 Web 架構應用程式,應用程式執行時,Microsoft Internet Information Services (IIS) 可能會鎖定檔案,防止您更新資源檔案。如果您將附屬組件中的資源放在應用程式的 \bin 子目錄中,當您建立新的應用程式定義域來處理後續的 Web 要求時,IIS 陰影複製機制會確保自動載入新的資源。