Dotnet中嵌入資源(位元影像、表徵圖或游標等)有兩種方式,一是直接把資源檔加入到項目,作為嵌入資源,在代碼中通過Assembly的GetManifestResourceStream方法擷取資源的Stream。另一種方法是在項目中加入. resx資源檔,在資源檔中添加資源,由ResourceManager類統一管理其中的資源。
下面分別詳述這兩種方法
一、使用GetManifestResourceStream讀取嵌入資源
1、加入資源檔
直接把要嵌入到程式集的資源檔加入到項目中,可以加在項目的根目錄,可以加在項目的任何目錄中。
2、設定資源檔的“BuildAction”屬性
將嵌入資源檔的“BuildAction”屬性設定為“Embedded Resource”
3、代碼中使用嵌入資源
//獲得正在運行類所在的名稱空間Type type = MethodBase.GetCurrentMethod().DeclaringType;string _namespace = type.Namespace;//獲得當前啟動並執行AssemblyAssembly _assembly = Assembly.GetExecutingAssembly();//根據名稱空間和檔案名稱產生資源名稱string resourceName = _namespace + ".directory.BitmapManifest.bmp";//根據資源名稱從Assembly中擷取此資源的StreamStream stream = _assembly.GetManifestResourceStream(resourceName);Image myImage = Image.FromStream(stream);
注意資源名稱的組成規則:
項目預設名稱空間.資源在項目中所在目錄.資源檔名
上面代碼中BitmapManifest.bmp位元影像就在項目的directory目錄下。如果資源檔直接在項目根目錄,則為項目預設名稱空間.資源檔名
再給一個xml資源的例子:
//獲得正在運行類所在的名稱空間Type type = MethodBase.GetCurrentMethod().DeclaringType;string _namespace = type.Namespace;//獲得當前啟動並執行AssemblyAssembly _assembly = Assembly.GetExecutingAssembly();//根據名稱空間和檔案名稱產生資源名稱string resourceName = _namespace + ".XMLFileTest.xml";//根據資源名稱從Assembly中擷取此資源的StreamStream stream = _assembly.GetManifestResourceStream(resourceName); XmlDocument xmlDoc = null;xmlDoc = new XmlDocument();xmlDoc.Load(stream);
二、使用. resx資源檔嵌入資源
1、建立資源檔
在項目中建立一個資源檔,資源檔以.resx為尾碼,同時還會建立一個跟資源檔同名的Designer.cs檔案。
其實資源檔最大的用處是用來做多語言版本的軟體時儲存不同語言的資源,比如不同語言的菜單文本,可以把不同語言的字串放在同一個資源類型下的不同資源套件中,程式運行時根據運行時系統的culture選擇不同的包顯示不同語言的字串。
建立了資源檔後就能往資源檔中添加資源檔:
圖1 .resx資源檔可內嵌資源類型
資源中可以添加字串、位元影像、表徵圖、音頻、檔案等等的資源。
添加的資源都會被儲存在項目的Resources檔案夾中。
2、設定資源檔的“BuildAction”屬性
Resources檔案夾中的所有資源檔的“BuildAction”屬性設定為“Embedded Resource”。
3、 資源存在方式
.resx資源檔管理的資源可以用兩種存在形式,一種是以一般的檔案形式存在於Resources檔案夾中,另一個是經過Base64編碼後嵌入到.resx資源檔中。
圖2 .resx資源檔中資源存在方式
開啟.resx資源檔,選擇資源,在屬性中Persistence屬性決定資源的存在形式。資源的兩種存在形式,在代碼中調用都是一樣的。
4、 代碼中使用嵌入資源
//獲得正在運行類所在的名稱空間Type type = MethodBase.GetCurrentMethod().DeclaringType;string _namespace = type.Namespace;//擷取當前主程式集Assembly currentAssembly = Assembly.GetExecutingAssembly();//資源的根名稱string resourceRootName = _namespace + ".ResourceTest";//執行個體化資源管理類ResourceManager resourceManager = new ResourceManager(resourceRootName, currentAssembly);//根據資源名獲得資來源物件Icon myIcon = (Icon)resourceManager.GetObject("IconTest");
注意資源的根名稱的規則:
資源的根名稱就是這個資源檔類的全名稱。
開啟.resx資源檔相應的Designer.cs檔案能看到資源類的全名稱:名稱空間.資源類名。
資源名就是某個資源在.resx資源檔中的名稱。
開啟.resx資源檔可以看到各個資源的名稱。上面圖中表徵圖檔案IconTest.ico的名稱是IconTest。
若要檢索“字串”資源,請調用 GetString 方法。
若要檢索其他類型的資源,請調用 GetObject 方法,並將得到的資源顯式轉換成對應的類型。
5、多語言的資源應用
//得到當前語言環境CultureInfo ci = Thread.CurrentThread.CurrentCulture;//CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;Icon myIcon = (Icon)resourceManager.GetObject("IconText", ci);
以上就是雲棲社區的為大家整理的兩種嵌入和使用資源檔的方法,本人比較偏向使用第二種,希望能幫到大家。