资源文件生成器(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 开发人员 PowerShell。
在命令提示符处,键入以下内容:
Syntax
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:
symbol1[, 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 编译器的或 /r: 选项。 |
filename.extension |
指定要转换的输入文件的名称。 如果使用的是此表之前显示的第一个更长度的命令行语法, extension 则必须是下列方法之一:.txt 或 .restext 要转换为 .resources 或 .resx 文件的文本文件。 文本文件只能包含字符串资源。 有关文件格式的信息,请参阅 创建资源文件的“文本文件中的资源”部分。 .resx 要转换为 .resources 或文本(.txt 或 .restext)文件的基于 XML 的资源文件。 。资源 要转换为 .resx 或文本(.txt 或 .restext)文件的二进制资源文件。 如果使用的是此表之前显示的第二个较短的命令行语法, extension 则必须为以下内容:.exe 或 .dll 一个 .NET Framework 程序集(可执行文件或库),其字符串资源将被提取到 .resw 文件,用于开发 Windows 8.x 应用商店应用。 |
outputFilename.extension |
指定要创建的资源文件的名称和类型。 从 .txt、.restext 或 .resx 文件转换为 .resources 文件时,此参数是可选的。 如果未指定 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#, cs或 csharp。- 对于 Visual Basic: 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 文件格式的更多详细信息,请参阅 “创建资源文件的 .resx 文件中的资源”部分。
若要创建包含嵌入的非字符串对象的 .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 文件格式相同,但 .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 创建一个 .resources 文件,该文件的根文件名与目录中的根文件名 inputFilename 相同 inputFilename。 如果 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 还可以将任何受支持的文件类型转换为任何其他受支持的文件类型。 这意味着它可以执行以下转换:
将 .resx 文件 .txt 和 .restext 文件。
用于 .txt 和 .restext 文件的 .resx 文件。
用于 .txt 和 .restext 文件的 .resources 文件。
.resx 文件的 .resources 文件。
语法与上一部分所示的语法相同。
此外,可以使用 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 可以通过从可执行文件或附属程序集中提取资源并将其写入到开发 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可以采用三个值之一,具体取决于命名的PRODUCTIONCONSULT符号,还是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 以检索资源的替代方法。 可以使用 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 创建一个 .resources 文件,该文件的根文件名与目录中的根文件名 inputFilename 相同 inputFilename。
outputFilename 可以是基于文本、基于 XML 或二进制 .resources 文件。 如果文件扩展名 outputFilename 与文件扩展名 inputFilename不同,Resgen.exe 执行文件转换。
如果 inputFilename 为 .resources 文件,则 Resgen.exe 复制 .resources 文件(如果 outputFilename 也是 .resources 文件)。 如果 outputFilename 省略,则 Resgen.exe 用相同的 .resources 文件进行覆盖 inputFilename 。
语言 要为其强类型资源类生成源代码的语言。 可能的值为、C# 代码vb和 visualbasic Visual Basic 代码以及 vbsvbscript VBScript 代码以及c++C++mccpp代码。csharpC#cs
Namespace 包含强类型资源类的命名空间。 .resources 文件和资源类应具有相同的命名空间。 有关指定命名空间 outputFilename的信息,请参阅 将资源编译为二进制文件。 如果省略 命名空间 ,则资源类不包含在命名空间中。
classname 强类型资源类的名称。 这应对应于 .resources 文件的根名称。 例如,如果 Resgen.exe 生成名为 MyCompany.Libraries.Strings.resources 的 .resources 文件,则强类型资源类的名称为 Strings。 如果省略 classname,则生成的类派生自根名称 。outputFilename 如果 outputFilename 省略,则生成的类派生自 的 inputFilename根名称。
classname 不能包含无效字符,如嵌入空格。 如果 classname 包含嵌入空格,或者默认情况下从 inputFilename 生成 classname,并且 inputFilename 包含嵌入空格,Resgen.exe 将所有无效字符替换为下划线 (_)。
文件名 类文件的名称。
/publicclass 将强类型资源类公开,而不是 internal (在 C# 中)或 Friend (在 Visual Basic 中)。 这允许从嵌入它们的程序集外部访问资源。
重要
创建强类型资源类时,.resources 文件的名称必须与生成的代码的命名空间和类名匹配。 但是,Resgen.exe 允许指定生成具有不兼容名称的 .resources 文件的选项。 若要解决此问题,请重命名生成后输出文件。
强类型资源类具有以下成员:
无参数构造函数,可用于实例化强类型资源类。
(
staticC#) 或Shared(Visual Basic) 和只读ResourceManager属性,该属性返回 ResourceManager 管理强类型资源的实例。静态
Culture属性,可用于设置用于资源检索的区域性。 默认情况下,其值为null,这意味着使用当前 UI 区域性。.resources 文件中每个资源的一
static个 (C#) 或Shared(Visual Basic) 和只读属性。 属性的名称是资源的名称。
例如,以下命令将名为 StringResources.txt 的资源文件编译为 StringResources.resources,并生成一个名为 StringResources.vb 的 Visual Basic 源代码文件中命名 StringResources 的类,该文件可用于访问资源管理器。
resgen StringResources.txt /str:vb,,StringResources