分享方式:


Resgen.exe (資源檔產生器)

資源檔產生器 (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 檔案,您可以使用語言編譯程式將二進位檔內嵌至可執行元件,也可以使用 元件連結器 (Al.exe) 將它們編譯成附屬元件。

此工具會自動與 Visual Studio 一起安裝。 若要執行此工具,請使用 Visual Studio 開發人員命令提示字元或 Visual Studio Developer 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]

參數

參數 描述
/define:symbol1[, symbol2,...] 從 .NET Framework 4.5 開始,支援以文字為基礎的條件式編譯 (.txt 或 .restext) 資源檔。 如果 symbol 對應至在 #ifdef 建構內輸入文字檔中的符號,關聯字串資源會包含在 .resources 檔案中。 如果輸入文字檔包含有不是 #if ! 參數所定義之符號的 /define 陳述式,關聯的字串資源會包含在資源檔中。

使用非文字檔案則會忽略 /define。 符號會區分大小寫。

如需這個選項的詳細資訊,請參閱本主題稍後的條件式編譯資源
useSourcePath 具體指明輸入檔的目前目錄是用來解析相對檔案路徑。
/compile 可讓您指定在單一大量作業中,將多個 .resx 或文字檔轉換成多個 .resources 檔案。 如果您不指定這個選項,則只能指定一個輸入檔引數。 輸出檔案的名稱為 <檔案名稱>.resources。

這個選項無法與 /str: 選項搭配使用。

如需這個選項的詳細資訊,請參閱本主題稍後的編譯或轉換多個檔案
/r: assembly 從指定的組件參考中繼資料。 在轉換 .resx 檔時,以及讓 Resgen.exe 序列化或還原序列化物件資源時使用。 它類似 C# 和 Visual Basic 編譯器的 /reference:/r: 選項。
filename.extension 指定要轉換的輸入檔名稱。 如果您使用這個資料表之前所呈現的第一個、更冗長的命令行語法, extension 必須是下列其中一項:

.txt 或 .restext
要轉換成 .resources 或 .resx 檔的文字檔。 文字檔只能包含字串資源。 如需檔格式的相關信息,請參閱建立資源檔的一節

.resx
要轉換成 .resources 或文字檔 (.txt 或 .restext) 的 XML 架構資源檔。

.resources
要轉換成 .resx 或文字檔 (.txt 或 .restext) 的二進位資源檔。

如果您使用的是這個資料表前的命令列語法中的第二個、較短者,extension 必須為下列其中一項:

.exe 或 .dll。
.NET Framework 元件(可執行檔或連結庫),其字串資源要解壓縮到 .resw 檔案,以用於開發 Windows 8.x 市集應用程式。
outputFilename.extension 指定要建立之資源檔的名稱和類型。

從 .txt、.restext 或 .resx 檔案轉換至 .resource 檔時,這是選擇性的引數。 如果沒有指定 outputFilename,Resgen.exe 會將 .resources 副檔名附加至輸入 filename 中,並且將檔案寫入包含 filename,extension 的目錄中。

從 .resources 檔轉換時,outputFilename.extension 是強制的引數。 在將 .resources 檔轉換成 XML 架構資源檔時指定檔案名稱及 .resx 副檔名。 將 .resources 檔案轉換成文字檔時,指定檔案名稱及 .txt 或 .restext 副檔名。 當 .resources 檔只包含字串值時,您應將 .resources 檔轉換成 .txt 檔。
outputDirectory 針對 Windows 8.x 市集應用程式,指定將寫入包含 字串資源的 filename.extension .resw 檔案所在的目錄。 outputDirectory 必須已經存在。
/str: language[,namespace[,classname[,filename]]] language 選項所指定的程式設計語言建立強類型資源類別檔案。 language 可包含下列其中一種常值:

- C#:c#cscsharp
- Visual Basic:vbvisualbasic
- VBScript:vbsvbscript
- C++:c++mccpp
- JavaScript:jsjscriptjavascript

您可以使用 namespace 選項指定專案的預設命名空間,使用 classname 選項指定所產生類別的名稱,以及使用 filename 選項指定類別檔的名稱。

/str: 選項只允許一個輸入檔,因此無法搭配 /compile 選項使用。

如果有指定 namespace 但未指定 classname,此時類別名稱便會衍生自該輸出檔名稱 (例如,以底線替代句號)。 這樣一來,強類型資源可能無法正確運作。 若要避免此問題,請同時指定類別名稱和輸出檔名稱。

如需這個選項的詳細資訊,請參閱本主題稍後的產生強型別資源類別
/publicClass 建立強類型資源類別做為公用類別。 根據預設,資源類別是在 C# 中的 internal 和 Visual Basic 中的 Friend

如果沒有使用 /str: 選項,則會忽略這個選項。

Resgen.exe 和資源檔類型

要成功地用 Resgen.exe 轉換資源,文字檔和 .resx 檔必須遵守正確格式。

文字檔 (.txt 和 .restext)

文字檔 (.txt 或 .restext) 只能包含字串資源。 如果您所撰寫的應用程式必須將字串轉譯成多種語言,字串資源是非常有用的。 例如,使用適當的字串資源,您可以輕易地按地區安排功能表字串。 Resgen.exe 會讀取含有名稱/值組的文字檔,其中名稱是描述資源的字串,而值是資源字串本身。

注意

如需.txt和 .restext 檔案格式的相關信息,請參閱建立資源檔的一節

包含資源的文字檔除非其只包含基本拉丁範圍 (到 U+007F) 內的字元,否則必須以 UTF-8 或 Unicode (UTF-16) 的編碼方式保存。 Resgen.exe 在處理使用 ANSI 編碼方式儲存的文字檔時,會移除延伸的 ANSI 字元。

Resgen.exe 會針對重複的資源名稱檢查文字檔。 如果文字檔包含重複的資源名稱,Resgen.exe 將會發出警告並忽略第二個值。

.resx 檔

.resx 資源檔格式由 XML 項目組成。 您可以在這些 XML 項目中指定字串資源,就像在文字檔中的方式一樣。 .resx 檔優於文字檔的原因,就是您也可以指定或內嵌物件。 在檢視 .resx 檔時,您可以實際看到內嵌物件 (如圖片) 的二進位格式 (當這個二進位資訊是資源資訊清單的一部分時)。 與文字檔一樣,您可以使用文字編輯器開啟 .resx 檔案 (例如 [記事本] 或 Microsoft Word) 並寫入、剖析和操作其內容。 請注意您必須對 XML 標記和 .resx 檔案結構有相當的認識才能這麼做。 如需 .resx 檔格式的詳細資訊,請參閱建立資源檔的<.resx 檔案中的資源>一節。

若要建立含有內嵌非字串物件的 .resources 檔,您必須使用 Resgen.exe 來轉換含有物件的 .resx 檔,或使用 ResourceWriter 類別提供的方法,直接從程式碼中將物件資源加入您的檔案。

如果使用 Resgen.exe 將含有物件的 .resx 檔或 .resources 檔轉換成文字檔,則所有字串資源都會正確的轉換,但是非字串物件的資料類型也會以字串的形式寫入檔案中。 在進行轉換時您將會遺漏內嵌物件,而 Resgen.exe 將會報告擷取資源時發生錯誤。

資源檔案類型間的轉換

當您在不同資源檔類型之間轉換時,根據來源和目標檔案的類型,Resgen.exe 可能無法執行轉換也可能會遺漏特定資源的詳細資訊。 從某種資源檔案類型轉換為另一種類型時,下表指定成功轉換的類型。

來源檔 轉至文字檔 轉至 .resx 檔 轉至 .resw 檔 轉至 .resources 檔
文字檔 (.txt 或 .restext) -- 沒有問題 不支援 沒有問題
.resx 檔 檔案包含非字串資源 (包括文件連結) 時轉換失敗 -- 不支援* 沒有問題
.resources 檔 檔案包含非字串資源 (包括文件連結) 時轉換失敗 沒有問題 不支援 --
.exe 或 .dll 組譯碼 不支援 不支援 只有字串資源 (包括路徑名稱) 被當做資源 不支援

*在 Windows 8.x 市集應用程式中,您可以使用 .resw 檔案來建立資源。 儘管擴展名不同,.resw 檔案格式與 .resx 檔案格式相同,但 .resw 檔案只能包含字串和檔案路徑。 只要變更擴展名,即可將只包含字串和檔案路徑的 .resx 檔案轉換成 .resw 檔案。

執行特定 Resgen.exe 工作

您可以透過不同方式來使用 Resgen.exe:將文字或 XML 架構資源檔編譯成二進位檔案、資源檔格式間的轉換和產生包裝 ResourceManager 功能並提供存取資源的類別。 本節提供各項工作的詳細資訊:

將資源編譯成二進位檔

最常見的 Resgen.exe 是用來將文字架構的資源檔 (.txt 或 .restext 檔) 或 XML 架構資源檔 (.resx 檔) 編譯成二進位 .resources 檔案。 輸出檔可以由語言編譯器內嵌在主要組件或由組件連結器 (AL.exe) 內嵌在附屬組件。

編譯資源檔的語法是:

resgen inputFilename [outputFilename]

其中的參數:

inputFilename 要編譯之資源文件的擴展名,包括檔名。 Resgen.exe 只編譯使用 .txt、.restext 或 .resx 為副檔名的檔案。

outputFilename 輸出檔的名稱。 如果您省略 outputFilename,Resgen.exe 會在和 inputFilename 相同的目錄下建立具有 inputFilename 之根檔案名稱的 .resources 檔。 如果 outputFilename 包含一個目錄路徑,則目錄必須存在。

您可以在 .resource 檔的檔案名稱中指定並將命名空間與根檔案名稱以一個句號分隔,為 .resources 檔案提供完整命名空間。 例如,如果 outputFilenameMyCompany.Libraries.Strings.resources,則命名空間是 MyCompany.Libraries。

下列命令會讀取 Resources.txt 中的名稱/值組,並且寫入名為 Resources.resources 的二進位 .resources 檔。 由於並未明確指定輸出檔名,因此預設會接收與輸入檔相同的名稱。

resgen Resources.txt

下列命令會讀取 Resources.restext 中的名稱/值組,並且寫入名為 StringResources.resources 的二進位 .resources 檔。

resgen Resources.restext StringResources.resources

下列命令會讀取 XML 架構檔案且名稱為 Resources.resx 的輸入檔,並寫入命名為 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 檔案,並寫入名為 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,編譯成不同檔名的 .resources 檔案,分別為 StringResources.resources、TableResources.resources 和 ImageResources.resources。

resgen /compile StringResources.txt TableResources.resx ImageResources.resx

將資源匯出至 .resw 檔案

如果您正在開發 Windows 8.x 市集應用程式,您可能想要使用現有傳統型應用程式的資源。 然而,這兩種應用程式支援不同的檔案格式。 在桌面應用程式中,文字檔 (.txt 或 .restext) 或 .resx 檔案的資源會編譯為二進位 .resources 檔案。 在 Windows 8.x 市集應用程式中,.resw 檔案會編譯成二進位套件資源索引 (PRI) 檔案。 您可以使用 Resgen.exe,藉由從可執行檔或附屬元件擷取資源,並將其寫入到開發 Windows 8.x 市集應用程式時可以使用的一或多個 .resw 檔案來彌合此差距。

重要

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 PRODUCTIONCONSULTRETAIL 的符號而定。

#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 資源的值為 "My Consulting Company Project Manager"。

產生強類型資源類別

Resgen.exe 支援強類型資源 (會建立包含一組靜態唯讀屬性的類別,以封裝對資源的存取)。 這提供直接呼叫 ResourceManager 類別的方法來擷取資源。 您可以使用 Resgen.exe 中的 /str 選項來啟用強類型資源的支援,以包裝 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 檔案且 outputFilename 也是 .resources 檔,則 Resgen.exe 會複製 .resources 檔案。 如果省略 outputFilename,Resgen.exe 會覆寫具有相同 .resources 檔案的 inputFilename

language 要為其強型別資源類別產生原始程式碼的語言。 針對 C# 程式碼,可能的值為 csC#csharp;針對 Visual Basic 程式碼,為 vbvisualbasic;針對 VBScript 程式碼,為 vbsvbscript;針對 C++ 程式碼,為 c++mccpp

namespace 包含強型別資源類別的命名空間。 .resources 檔案和資源類別應該有相同的命名空間。 如需指定 outputFilename 的命名空間之詳細資訊,請參閱編譯資源至二進位檔中。 如果省略 namespace,則命名空間不會包含資源類別。

classname 強型別資源類別的名稱。 這應該會對應於 .resources 檔的根名稱。 例如,如果 Resgen.exe 產生名為 MyCompany.Libraries.Strings.resources 的 .resources 檔案,強類型資源類別的名稱會為 Strings。 如果省略 classname,產生的類別會衍生自 outputFilename 的根目錄名稱。 如果省略 outputFilename,產生的類別會衍生自 inputFilename 的根目錄名稱。

classname 無法包含無效的字元 (如空白字元)。 如果 classname 包含空白字元,或如果 classname 預設是由 inputFilename 產生,並且 inputFilename 包含空白字元,則 Resgen.exe 會以底線 (_) 取代所有無效的字元。

filename 類別檔案的名稱。

/publicclass 將強型別資源類別設為公用,而不是 internal (在 C# 中) 或 Friend (在 Visual Basic 中)。 這可讓資源從它們的內嵌組件外部存取。

重要

當您建立強類型資源類別時,您的 .resources 檔案的名稱必須符合所產生程式碼的命名空間和類別名稱。 不過,Resgen.exe 可讓您指定所產生 .resources 檔案有不相容名稱的選項。 為了解決這個行為,可在它產生之後重新命名輸出檔案。

強類型資源類別具有下列成員:

  • 無參數建構函式,可用來具現化強型別資源類別。

  • static (C#) 或 Shared (Visual Basic) 和唯讀 ResourceManager 屬性,可傳回 ResourceManager 管理強類型資源的執行個體。

  • 靜態 Culture 屬性,可讓您將文化特性設定為資源擷取使用。 根據預設,它的值是為 null,表示已使用目前的 UI 文化特性。

  • 在 .resource 檔中每個 resource 的 static (C#) 或 Shared (Visual Basic) 和唯讀屬性。 屬性名稱是資源的名稱。-

例如,下列命令會將名為 StringResources.txt 編譯為 StringResources.resources,並且在一個名為 StringResources.vb 的 Visual Basic 原始程式碼中產生名為 StringResources 的類別,可用於存取資源管理員。

resgen StringResources.txt /str:vb,,StringResources

另請參閱