資源檔案產生器(Resgen.exe)將文字(.txt 或.restext)檔案及基於XML的資源格式(.resx)檔案轉換成可用於執行時二進位檔或衛星組合的通用語言執行檔(.resources)。 欲了解更多資訊,請參閱 建立資源檔案。
Resgen.exe 是一款通用資源轉換工具,執行以下任務:
將 .txt 或 .restext 檔案轉換為 .resources 或 .resx 檔案。 (.restext 檔案的格式與 .txt 檔案的格式相同。不過,.restext 副檔名能幫助你更容易辨識包含資源定義的文字檔。)
將 .resources 檔案轉成文字或 .resx 檔案。
將 .resx 檔案轉換為文字或 .resources 檔案。
將組合語言中的字串資源解壓成適合在 Windows 8.x 商店應用程式中使用的 .resw 檔案。
建立一個強型別類別,提供對個別命名資源及實例的 ResourceManager 存取。
若 Resgen.exe 因任何原因失敗,回傳值為 -1。
若要獲得 Resgen.exe協助,您可以使用以下指令(未指定選項)顯示 Resgen.exe的指令語法與選項:
resgen
你也可以使用開關 /? :
resgen /?
如果你用 Resgen.exe 產生二進位 .resources 檔案,可以用語言編譯器將二進位檔案嵌入可執行組合語言,或使用 Assembly Linker(Al.exe) 將它們編輯成衛星組合語言。
此工具會自動安裝於 Visual Studio 中。 要執行此工具,請使用 Visual Studio 開發者命令提示字元或 Visual Studio 開發者 PowerShell。
在命令提示字元輸入以下內容:
語法
resgen [-define:symbol1[,symbol2,...]] [/useSourcePath] filename.extension | /compile filename.extension... [outputFilename.extension] [/r:assembly] [/str:lang[,namespace[,class[,file]]] [/publicclass]]
resgen filename.extension [outputDirectory]
參數
| 參數或開關 | Description |
|---|---|
/define:
符號1[, symbol2,...] |
從 .NET Framework 4.5 開始,支援在文字(.txt 或 .restext)資源檔案中進行條件編譯。 如果 符號 對應於結構中 #ifdef 輸入文字檔中包含的符號,則相關的字串資源會包含在 .resources 檔案中。 如果輸入文字檔包含 #if ! 一個符號未由 /define 交換器定義的語句,相關字串資源會包含在資源檔案中。/define 若用於非文字檔案,則會被忽略。 符號是區分大小寫的。欲了解更多此選項,請參閱本主題後面的 「條件編譯資源 」。 |
useSourcePath |
指定輸入檔案目前的目錄用於解析相對檔案路徑。 |
/compile |
讓你能在一次批量操作中指定多個 .resx 或文字檔,轉成多個 .resources 檔案。 如果你沒有指定這個選項,你只能指定一個輸入檔案參數。 輸出檔案命名為 filename.resources。 這個選項不能搭配 /str: 選項一起使用。欲了解更多此選項,請參閱本主題後面 的「編譯或轉換多個檔案 」。 |
/r:
assembly
|
參考指定組件的元資料。 它用於轉換 .resx 檔案,並允許 Resgen.exe 序列化或反序列化物件資源。 它類似 /reference: 於 C# 和 Visual Basic 編譯器的 OR /r: 選項。 |
filename.extension |
指定要轉換的輸入檔案名稱。 如果你使用的是表格中第一個較長的命令列語法, extension 必須是以下其中一種:.txt 或 .restext 一個文字檔,可以轉成 .resources 或 .resx 檔案。 文字檔只能包含字串資源。 關於檔案格式的資訊,請參閱 「建立資源檔案」的「文字檔案中的資源」區塊。 .resx 一個基於 XML 的資源檔案,可轉換為 .resources 或文字(.txt 或 .restext)檔案。 。資源 一個二進位資源檔,可轉換成 .resx 或文字(.txt 或 .restext)檔案。 如果你使用的是表前第二個較短的命令列語法, extension 必須是以下格式:.exe 或 .dll 一個 .NET Framework 組合語言(可執行檔或函式庫),其字串資源將解壓成 .resw 檔案,用於開發 Windows 8.x Store 應用程式。 |
outputFilename.extension |
指定要建立的資源檔案名稱與類型。 當從 .txt、.restext 或 .resx 檔案轉換成 .resources 檔案時,此參數是可選的。 若未指定 outputFilename,Resgen.exe 會在輸入 filename 後附加 .resources 副檔名,並將檔案寫入包含 filename,extension的目錄。從 .resources 檔案轉換時,這個 outputFilename.extension 參數是必須的。 將 .resources 檔案轉換為基於 XML 的資源檔案時,請指定副檔名為 .resx 的檔名。 將 .resources 檔案轉換為文字檔時,請指定副檔名為 .txt 或 .restext 副檔名。 只有當 .resources 檔案只包含字串值時,才應該將 .resources 檔案轉成 .txt。 |
outputDirectory |
對於 Windows 8.x Store 應用程式,會指定將寫入包含字串資源 filename.extension 的 .resw 檔案的目錄。
outputDirectory 一定已經存在了。 |
/str:
language[,namespace[,classname[,filename]]]
|
建立一個強型別的資源類別檔案,並使用該選項指定的 language 程式語言。
language 可以包含以下其中一種文字:- 對於 C#: c#, cs, , 或 csharp。- 對於視覺基礎: vb 或 visualbasic。- 對於 VBScript: vbs 或 vbscript。- 對於 C++: c++, mc, 或 cpp。- 對於 JavaScript: js, jscript, , 或 javascript。選項 namespace 指定專案的預設命名空間,選項 classname 指定產生類別的名稱,選項 filename 指定類別檔案名稱。此 /str: 選項僅允許一個輸入檔案,因此無法與該 /compile 選項一起使用。若 namespace 指定 classname 但未指定,類別名稱將由輸出檔名衍生(例如,底線取代句點)。 強型別的資源可能因此無法正常運作。 為避免此問題,請同時指定類別名稱與輸出檔名。欲了解更多此選項,請參閱本主題後面 的「產生強型別資源類別 」。 |
/publicClass |
建立一個強型別的資源類別作為公共類別。 預設情況下,資源類別是 internal C# 和 Friend Visual Basic 格式。若 /str: 未使用該選項,則忽略此選項。 |
Resgen.exe 與資源檔案類型
為了讓 Resgen.exe 成功轉換資源,文字和 .resx 檔案必須遵循正確的格式。
文字(.txt 和 .restext 檔案)
文字(.txt 或 .restext)檔案可能僅包含字串資源。 如果你寫的應用程式必須將字串翻譯成多種語言,字串資源非常有用。 例如,你可以透過適當的字串資源輕鬆區域化選單字串。 Resgen.exe 讀取包含名稱/值對的文字檔,其中名稱是描述資源的字串,而值則是資源字串本身。
備註
關於 .txt 和 .restext 檔案格式的資訊,請參閱 「建立資源檔案」中的「文字檔案中的資源」章節。
包含資源的文字檔必須以 UTF-8 或 Unicode(UTF-16)編碼儲存,除非只包含基本拉丁字母範圍(至 U+007F)。 Resgen.exe 在處理使用 ANSI 編碼儲存的文字檔時,會移除擴展的 ANSI 字元。
Resgen.exe 會檢查文字檔是否有重複的資源名稱。 如果文字檔包含重複的資源名稱,Resgen.exe 會發出警告並忽略第二個值。
.resx 檔案
.resx 資源檔案格式由 XML 條目組成。 你可以像在文字檔中一樣,在這些 XML 項目中指定字串資源。 .resx 檔案相較於文字檔的主要優點是你也可以指定或嵌入物件。 當你查看 .resx 檔案時,當這個二進位資訊是資源清單的一部分時,你可以看到嵌入物件(例如圖片)的二進位形式。 與文字檔相同,您可以使用文字編輯器(如記事本或 Microsoft Word)開啟 .resx 檔案,並撰寫、解析及操作其內容。 請注意,這需要對 XML 標籤和 .resx 檔案結構有良好的了解。 欲了解更多 .resx 檔案格式的詳細資訊,請參閱 「建立資源檔案」中的「Resources in .resx Files」章節。
若要建立包含嵌入非字串物件的 .resources 檔案,您必須使用 Resgen.exe 轉換包含物件的 .resx 檔案,或直接從程式碼呼叫類別提供 ResourceWriter 的方法將物件資源加入檔案。
如果你的 .resx 或 .resources 檔案包含物件,並且你用 Resgen.exe 將其轉換成文字檔,所有字串資源都會正確轉換,但非字串物件的資料型態也會以字串的形式寫入檔案。 轉換過程中會遺失嵌入物件,Resgen.exe 會回報資源取回時發生錯誤。
資源檔案類型間的轉換
當你在不同資源檔案類型間轉換時,Resgen.exe 可能無法執行轉換,或會遺失特定資源的資訊,這取決於來源和目標檔案類型。 下表說明了從一種資源檔案類型轉換為另一種時,成功轉換的類型。
| 轉換自 | 轉為文字檔 | 轉到 .resx 檔案 | 轉到 .resw 檔案 | 轉到 .resources 檔案 |
|---|---|---|---|---|
| 文字(.txt 或 .restext)檔案 | -- | 沒問題 | 不支援 | 沒問題 |
| .resx 檔案 | 若檔案包含非字串資源(包括檔案連結),轉換失敗 | -- | 不支援* | 沒問題 |
| .resources 檔案 | 若檔案包含非字串資源(包括檔案連結),轉換失敗 | 沒問題 | 不支援 | -- |
| .exe 或 .dll 組裝 | 不支援 | 不支援 | 只有字串資源(包括路徑名稱)被識別為資源 | 不支援 |
*在 Windows 8.x 商店應用程式中,你會使用 .resw 檔案來建立資源。 儘管檔案副檔名不同,.resw 檔案格式與 .resx 檔案格式相同,僅可包含字串與檔案路徑。 你只要改變副檔名,就能將只包含字串和檔案路徑的 .resx 檔案轉換成 .resw 檔案。
執行特定 Resgen.exe 任務
你可以用 Resgen.exe 做多種方式:將文字或 XML 資源檔案編譯成二進位檔、在資源檔案格式間轉換,以及產生一個包覆 ResourceManager 功能並提供資源存取的類別。 本節提供各項任務的詳細資訊:
將資源編譯成二進位檔案
Resgen.exe 最常見的用途是將基於文字的資源檔案(.txt 或 .restext 檔案)或基於 XML 的資源檔案(.resx 檔案)編譯成二進位的 .resources 檔案。 輸出檔可由語言編譯器嵌入主組合語言,或由 Assembly Linker(AL.exe)嵌入衛星組合。
編譯資源檔案的語法如下:
resgen inputFilename [outputFilename]
其中參數為:
inputFilename 要編譯的資源檔案的檔名(包括副檔名)。 Resgen.exe 僅編譯副檔名為 .txt、.restext 或 .resx 的檔案。
outputFilename 輸出檔案的名稱。 若省略 outputFilename,Resgen.exe 會在與 inputFilename相同目錄中建立一個根檔名 的 inputFilename .resources 檔案。 如果 outputFilename 包含目錄路徑,則該目錄必須存在。
你透過在檔名中指定 .resources 檔案,並在根檔名中用句點分隔,來提供一個完全限定的命名空間。 例如,若 outputFilename , MyCompany.Libraries.Strings.resources則命名空間為 MyCompany.Libraries。
以下指令讀取 Resources.txt 中的名稱/值對,並寫入一個名為 Resources.resources 的二進位 .resources 檔案。 由於輸出檔名未明確指定,預設會與輸入檔名稱相同。
resgen Resources.txt
以下指令讀取 Resources.restext 中的名稱/值對,並寫入一個名為 StringResources.resources 的二進位資源檔案。
resgen Resources.restext StringResources.resources
以下指令讀取一個名為 Resources.resx 的 XML 輸入檔案,並寫入一個名為 Resources.resources 的二進位 .resources 檔案。
resgen Resources.resx Resources.resources
資源檔案類型間的轉換
除了將文字或 XML 資源檔案編譯成二進位 .resources 檔案外,Resgen.exe 還能將任何支援的檔案類型轉換為其他支援的檔案類型。 這表示它可以執行以下轉換:
.txt 和 .restext 檔案轉成 .resx 檔案。
.resx 檔案轉成 .txt 和 .restext 檔案。
.resources 檔案轉為 .txt 和 .restext 檔案。
.resources 檔案轉成 .resx 檔案。
語法與前一節所示相同。
此外,你也可以用 Resgen.exe 將 .NET Framework 組合包中的嵌入資源轉換成 Windows 8.x 商店應用程式的 .resw 檔案。
以下指令讀取一個二進位資源檔案 Resources.resources,並寫入一個名為 Resources.resx 的基於 XML 的輸出檔。
resgen Resources.resources Resources.resx
以下指令讀取一個名為 StringResources.txt 的文字資源檔案,並寫入一個名為 LibraryResources.resx 的 XML 資源檔案。 除了包含字串資源外,.resx 檔案也可用來儲存非字串資源。
resgen StringResources.txt LibraryResources.resx
以下兩個指令讀取一個名為 Resources.resx 的 XML 資源檔案,並寫入名為 Resources.txt 和 Resources.restext 的文字檔。 請注意,若 .resx 檔案包含任何嵌入物件,這些物件將無法準確轉換成文字檔。
resgen Resources.resx Resources.txt
resgen Resources.resx Resources.restext
編譯或轉換多個檔案
你可以用 /compile 這個開關,一次操作就能將資源檔案清單從一種格式轉換成另一種格式。 語法為:
resgen /compile filename.extension [filename.extension...]
以下指令會將三個檔案 StringResources.txt、TableResources.resw 和 ImageResources.resw 編譯成分別命名為 StringResources.resources、TableResources.resources 和 ImageResources.resources 的 .resources 檔案。
resgen /compile StringResources.txt TableResources.resx ImageResources.resx
將資源匯出為 .resw 檔案
如果你正在開發 Windows 8.x 商店應用程式,可能會想使用現有桌面應用程式的資源。 然而,這兩種應用程式支援的檔案格式不同。 在桌面應用程式中,文字(.txt 或 .restext 或 .resx 檔案)的資源會被編譯成二進位 .resources 檔案。 在 Windows 8.x 商店應用程式中,.resw 檔案會被編譯成二進位套件資源索引(PRI)檔案。 你可以利用 Resgen.exe 來彌補這個缺口,方法是從執行檔或衛星組件中擷取資源,並寫入一個或多個 .resw 檔案,方便開發 Windows 8.x 商店應用程式。
這很重要
Visual Studio 自動處理將可攜式函式庫資源整合到 Windows 8.x 商店應用程式所需的所有轉換。 直接使用 Resgen.exe 將組合語言中的資源轉換成 .resw 檔案格式,僅對想在 Visual Studio 外開發 Windows 8.x 商店應用程式的開發者感興趣。
從組合語言產生 .resw 檔案的語法如下:
resgen filename.extension [outputDirectory]
其中參數為:
filename.extension .NET Framework 組件的名稱(可執行檔或.DLL)。 如果檔案中沒有資源,Resgen.exe 就不會產生任何檔案。
outputDirectory 這是用來寫入 .resw 檔案的現有目錄。 若 outputDirectory 省略,.resw 檔案會寫入目前目錄。 Resgen.exe 為組合語言中的每個 .resources 檔案建立一個 .resw 檔案。 .resw 檔案的根檔名稱與 .resources 檔案的根名稱相同。
以下指令在 Win8Resources 目錄中為每個嵌入於 MyApp.exe的 .resources 檔案建立 .resw 檔案:
resgen MyApp.exe Win8Resources
條件編譯資源
從 .NET Framework 4.5 開始,Resgen.exe 支援在文字檔(.txt 和 .restext)中條件編譯字串資源。 這讓你能在多種建置配置中使用單一文字資源檔案。
在 .txt 或 .restext 檔案中,你會使用 #ifdef...
#endif 如果符號已定義,則在二進位 .resources 檔案中包含資源;若符號未定義,則使用 #if !... #endif 結構來包含資源。 編譯時,你用選項加上逗號分隔的符號列表來定義符號。/define: 比較會區分大小寫。 由 定義的 /define 符號的格必須與待編譯的文本檔案中符號的格符相符。
例如,以下名為 UIResources.text 的檔案包含一個名為 AppTitle 的字串資源,根據符號是否被定義 PRODUCTION為 、 CONSULT或 , RETAIL 可以取三種值之一。
#ifdef PRODUCTION
AppTitle=My Software Company Project Manager
#endif
#ifdef CONSULT
AppTitle=My Consulting Company Project Manager
#endif
#ifdef RETAIL
AppTitle=My Retail Store Project Manager
#endif
FileMenuName=File
接著可以用以下指令將檔案編譯成二進位 .resources 檔案:
resgen /define:CONSULT UIResources.restext
這會產生一個包含兩個字串資源的 .resources 檔案。 這個 AppTitle 資源的價值是「我的顧問公司專案經理」。
產生強型別的資源類別
Resgen.exe 支援強型別資源,透過建立包含一組靜態唯讀屬性的類別來封裝資源存取。 這提供了一種替代於直接呼叫類別方法 ResourceManager 以擷取資源的替代方案。 你可以透過 /str Resgen.exe中的選項來啟用強型別資源支援,這可以包覆該 StronglyTypedResourceBuilder 類別的功能。 當你指定該選項時 /str ,Resgen.exe 的輸出是一個包含強型別屬性的類別,這些屬性與輸入參數中引用的資源相符。 此類別提供強型別的唯讀存取,存取所處理檔案中可用的資源。
建立強型別資源的語法如下:
resgen inputFilename [outputFilename] /str:language[,namespace,[classname[,filename]]] [/publicClass]
參數與開關如下:
inputFilename 用於產生強型別資源類別的資源檔案的檔名(包括副檔名)。 該檔案可以是文字、XML 或二進位 .resources 檔案;它可以有 .txt、.restext、.resw 或 .resources 的副檔名。
outputFilename 輸出檔案的名稱。 如果 outputFilename 包含目錄路徑,則該目錄必須存在。 若省略 outputFilename,Resgen.exe 會在與 inputFilename相同目錄中建立一個根檔名 的 inputFilename .resources 檔案。
outputFilename 可以是文字、XML 或二進位的 .resources 檔案。 如果 的 outputFilename 副檔名與 的 inputFilename副檔名不同,Resgen.exe 執行檔案轉換。
如果 inputFilename 是 .resources 檔案,Resgen.exe 複製 .resources 檔案(如果 outputFilename 也是 .resources 檔案)。 若 outputFilename 省略,Resgen.exe 會 inputFilename 覆寫成相同的 .resources 檔案。
語言 用來產生強型別資源類別原始碼的語言。 可能的值包括 、 、 用於 C# 程式碼、 vbvisualbasic Visual Basic 程式碼、vbscriptvbs VBScript 程式碼、c++以及 、 mc、 用於 cpp C++ 程式碼。csharpC#cs
命名空間 包含強型別資源類別的命名空間。 .resources 檔案和資源類別應該有相同的命名空間。 關於在 中指定命名空間 outputFilename的資訊,請參見 「將資源編譯成二進位檔案」。 若遺漏 命名空間 ,則該資源類別不包含於命名空間中。
班名 強型別資源類別的名稱。 這應該對應 .resources 檔案的根名稱。 例如,若 Resgen.exe 產生一個名為 MyCompany.Libraries.Strings.resources 的 .resources 檔案,強型別資源類別的名稱為 Strings。 若省略 類別名稱 ,產生的類別即由 的 outputFilename根名稱衍生。 若 outputFilename 省略 ,生成的類別即由 的 inputFilename根名衍生。
classname 不能包含無效字元,例如嵌入空格。 如果 classname 包含嵌入的空格,或 classname 預設由 inputFilename 產生,且 inputFilename 包含嵌入的空格,Resgen.exe 會將所有無效字元替換為底線(_)。
檔名 那個類別檔案的名稱。
/publicclass 讓強型別的資源類別成為公開,而不是 internal (在 C# 中)或 Friend (在 Visual Basic 中)。 這使得資源能夠從嵌入的組件外部存取。
這很重要
當你建立強型別的資源類別時,.resources 檔案的名稱必須與產生的程式碼的命名空間和類別名稱相符。 不過,Resgen.exe 允許你指定產生名稱不相容的 .resources 檔案選項。 為了解決這個問題,可以在輸出檔案產生後重新命名。
強型別資源類別包含以下成員:
一個無參數建構子,可用來實例強型別的資源類別。
一個
static(C#) 或Shared(Visual Basic) 以及唯ResourceManager讀屬性,回傳 ResourceManager 管理強型別資源的實例。一個靜態
Culture屬性,允許你設定用於資源擷取的文化。 預設值為null,表示使用的是目前的 UI 文化。.resources 檔案中每個資源有一個
static(C# 或SharedVisual Basic)和唯讀屬性。 財產名稱即資源名稱。-
例如,以下指令會將一個名為 StringResources.txt 的資源檔案編譯成 StringResources.resources,並在一個名為 StringResources.vb 的 Visual Basic 原始碼中產生一個類別 StringResources ,該類別可用於存取資源管理器。
resgen StringResources.txt /str:vb,,StringResources