.NET 組件可內嵌圖片、圖示、字串表等資源,達成封裝、重用與本地化。本文涵蓋兩種建立方式(ResGen 命令列、ResourceWriter 程式碼)、Visual Studio 嵌入設定、ResourceManager 存取模式,並附完整 Windows Forms 範例。
userinfo.txt,格式 Key="Value":Username="Songh"
Sex="Boy"
Birthday="1973-01-15"
Salary="5000RMB"
.resources:ResGen userinfo.txt
.resx:ResGen userinfo.resources userinfo.resx
限制:不支援圖片等二進位資源。
using System.Resources;
using System.Drawing;
var rw = new ResourceWriter("userinfo.resources");
rw.AddResource("Photo", Image.FromFile("photo.gif")); // 圖片
rw.AddResource("Username", "songh");
rw.AddResource("Sex", "boy");
rw.AddResource("Birthday", "1973-01-15");
rw.AddResource("Salary", "5000RMB");
rw.Close(); // 隱式呼叫 Generate()
AddResource(string, object) 多載支援字串、圖片、圖示、自訂序列化物件。.resources。using System.Reflection;
using System.Resources;
var asm = Assembly.GetExecutingAssembly();
// 根名稱 = 預設命名空間 + "." + 資源檔名(不含副檔名)
var rm = new ResourceManager("MyProject.Userinfo", asm);
// 取得字串
string name = rm.GetString("Username");
// 取得圖片/圖示(需轉型)
Image img = (Image)rm.GetObject("Photo");
Icon ico = (Icon)rm.GetObject("IconKey");
根名稱規則:DefaultNamespace.ResourceFileName。可用 asm.GetManifestResourceNames() 列舉實際名稱除錯。
foreach (string resName in asm.GetManifestResourceNames())
{
using (var stream = asm.GetManifestResourceStream(resName))
using (var reader = new ResourceReader(stream))
{
foreach (DictionaryEntry entry in reader)
{
Console.WriteLine($"{entry.Key} = {entry.Value}");
}
}
}
表單含 PictureBox、四個 TextBox、四個 Button,分別載入圖片 1、圖片 2、圖示、字串。程式碼見原文,核心邏輯為按鈕事件中建立 ResourceManager 並指派資源給控制項。
.resx + Visual Studio 設計器(強型別生成)。ResourceWriter。ResourceManager + 根名稱。Resources.zh-TW.resx 等文化特性檔,ResourceManager 自動依 CurrentUICulture 落選。