轉自:笨笨.Netui
Dotnet中嵌入資源(位圖、圖標或光標等)有兩種方式,一是直接把資源文件加入到項目,做爲嵌入資源,在代碼中經過Assembly的 GetManifestResourceStream方法獲取資源的Stream。另外一種方法是在項目中加入. resx資源文件,在資源文件中添加資源,由ResourceManager類統一管理其中的資源。編碼
下面分別詳述這兩種方法spa
1、 使用GetManifestResourceStream讀取嵌入資源
一、 加入資源文件
直接把要嵌入到程序集的資源文件加入到項目中,能夠加在項目的根目錄,能夠加在項目的任何目錄中。code
二、 設置資源文件的「BuildAction」屬性
將嵌入資源文件的「BuildAction」屬性設置爲「Embedded Resource」xml
三、 代碼中使用嵌入資源
//
得到正在運行類所在的名稱空間
Type type
=
MethodBase.GetCurrentMethod().DeclaringType;
string
_namespace
=
type.Namespace;
//
得到當前運行的Assembly
Assembly _assembly
=
Assembly.GetExecutingAssembly();
//
根據名稱空間和文件名生成資源名稱
string
resourceName
=
_namespace
+
"
.directory.BitmapManifest.bmp
"
;
//
根據資源名稱從Assembly中獲取此資源的Stream
Stream stream
=
_assembly.GetManifestResourceStream(resourceName);
Image myImage
=
Image.FromStream(stream);
注意資源名稱的組成規則:對象
項目默認名稱空間.資源在項目中所在目錄.資源文件名 blog
上面代碼中BitmapManifest.bmp位圖就在項目的directory目錄下。若是資源文件直接在項目根目錄,則爲項目默認名稱空間.資源文件名
ci
再給一個xml資源的例子:資源
//
得到正在運行類所在的名稱空間
Type type
=
MethodBase.GetCurrentMethod().DeclaringType;
string
_namespace
=
type.Namespace;
//
得到當前運行的Assembly
Assembly _assembly
=
Assembly.GetExecutingAssembly();
//
根據名稱空間和文件名生成資源名稱
string
resourceName
=
_namespace
+
"
.XMLFileTest.xml
"
;
//
根據資源名稱從Assembly中獲取此資源的Stream
Stream stream
=
_assembly.GetManifestResourceStream(resourceName);
XmlDocument xmlDoc
=
null
;
xmlDoc
=
new
XmlDocument();
xmlDoc.Load(stream);
2、 使用. resx資源文件嵌入資源
一、 新建資源文件
在項目中新建一個資源文件,資源文件以.resx爲後綴,同時還會新建一個跟資源文件同名的Designer.cs文件。字符串
其實資源文件最大的用處是用來作多語言版本的軟件時保存不一樣語言的資源,好比不一樣語言的菜單文本,能夠把不一樣語言的字符串放在同一個資源類型下的不一樣資源包中,程序運行時根據運行時系統的culture選擇不一樣的包顯示不一樣語言的字符串。
新建了資源文件後就能往資源文件中添加資源文件:
Figure.1 .resx資源文件可嵌入的資源類型
資源中能夠添加字符串、位圖、圖標、音頻、文件等等的資源。
添加的資源都會被保存在項目的Resources文件夾中。
二、 設置資源文件的「BuildAction」屬性
Resources文件夾中的全部資源文件的「BuildAction」屬性設置爲「Embedded Resource」。
三、 資源存在方式
.resx資源文件管理的資源能夠用兩種存在形式,一種是以通常的文件形式存在於Resources文件夾中,另外一個是通過Base64編碼後嵌入到.resx資源文件中。
Figure.2 .resx資源文件中資源存在方式
打開.resx資源文件,選擇資源,在屬性中Persistence屬性決定資源的存在形式。資源的兩種存在形式,在代碼中調用都是同樣的。
四、 代碼中使用嵌入資源
//
得到正在運行類所在的名稱空間
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 方法,並將獲得的資源顯式轉換成對應的類型。
五、 多語言的資源應用
//
獲得當前語言環境
CultureInfo ci
=
Thread.CurrentThread.CurrentCulture;
//
CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;
Icon myIcon
=
(Icon)resourceManager.GetObject(
"
IconText
"
, ci);