GenerateResource 任务
将文本 .txt
和 .resx
(基于 XML 的资源格式)文件转换为公共语言运行时二进制 .resources
文件,这些 .resources 文件可嵌入到运行时二进制可执行文件中或编译到附属程序集中。 此任务通常用于将 .txt
或 .resx
文件转换为 .resources
文件。 GenerateResource
任务在功能上类似于 resgen.exe。
注意
.resx
文件中的资源可以使用不安全的 BinaryFormatter
进行序列化。 仅在你信任的生成过程中包含这些 .resx
文件。
参数
下表描述了 GenerateResource
任务的参数。
参数 | 说明 |
---|---|
AdditionalInputs |
可选 ITaskItem[] 参数。包含此任务完成的依赖项检查的其他输入。 例如,项目和目标通常应该为输入,以便在对它们进行更新时,所有资源都重新生成。 |
EnvironmentVariables |
可选 String[] 参数。除(或选择性替代)常规环境块外,还指定应传递到生成的 resgen.exe 中的环境变量的名称/值对数组。 |
ExcludedInputPaths |
可选 ITaskItem[] 参数。指定项的数组,这些项指定在更新检查期间将从中忽略跟踪输入的路径。 |
ExecuteAsTool |
可选 Boolean 参数。如果为 true ,请于进程外从适当的目标框架运行 tlbimp.exe 和 aximp.exe 来生成所需的包装器程序集。 此参数允许多目标的 ResolveComReferences 。 |
FilesWritten |
可选的 ITaskItem[] 输出参数。包含写入磁盘的所有文件的名称。 其中包含缓存文件(如果存在)。 此参数对实现 Clean 非常有用。 |
MinimalRebuildFromTracking |
可选 Boolean 参数。获取或设置一个开关,用于指定是否使用跟踪的增量生成。 如果为 true ,则启用增量生成;否则,将强制执行重新生成。 |
NeverLockTypeAssemblies |
可选 Boolean 参数。获取或设置一个布尔值,该值指定是创建新的 AppDomain 来计算资源 (.resx) 文件 (true) 还是仅当资源文件引用用户的程序集时才创建新的 AppDomain (false)。 |
OutputResources |
可选的 ITaskItem[] 输出参数。指定生成的文件(如 .resources 文件)的名称。 如果不指定名称,则会使用匹配输入文件的名称,且创建的 .resources 文件会放在包含此输入文件的目录之中。 |
PublicClass |
可选 Boolean 参数。如果为 true ,则会将强类型的资源类创建为公共类。 |
References |
可选 String[] 参数。要从中加载 .resx 文件中的类型的引用。 .resx 文件数据元素可能具有 .NET 类型。 读取 .resx 文件时,必须对此类型进行解析。 通常,使用标准类型加载规则可成功解析。 如果在 References 中提供程序集,则它们具有优先级。强类型资源不要求此参数。 |
SdkToolsPath |
可选 String 参数。指定 SDK 工具(例如 resgen.exe)的路径 。 |
Sources |
必选 ITaskItem[] 参数。指定要转换的项。 传递到此参数的项必须具有以下文件扩展名之一: - .txt :指定要转换的文本文件的扩展名。 文本文件只能包含字符串资源。- .resx :指定要转换的基于 XML 的资源文件的扩展名。 - .restext :指定与 .txt 相同的格式 。 如果要在生成过程中明确区分包含资源的源文件与其他源文件,则这个不相同的扩展名非常有用。 - .resources :指定要转换的资源文件的扩展名。 |
StateFile |
可选 ITaskItem 参数。 指定用于加速 .resx 输入文件中链接的依赖项检查的可选缓存文件的路径 。 |
StronglyTypedClassName |
可选 String 参数。指定强类型资源类的类名。 如果未指定此参数,则使用资源文件的基名称。 |
StronglyTypedFilename |
可选 ITaskItem 参数。 指定源文件的文件名。 如果未指定此参数,则会将类的名称用作基文件名,其扩展名取决于语言。 例如:MyClass.cs 。 |
StronglyTypedLanguage |
可选 String 参数。指定在为强类型资源生成类源时要使用的语言。 此参数必须与 CodeDomProvider 所使用的其中一种语言完全匹配。 例如 VB 或 C# 。通过将值传递给此参数来指示任务生成强类型资源。 |
StronglyTypedManifestPrefix |
可选 String 参数。指定要在强类型资源的生成类源中使用的资源命名空间或清单前缀。 |
StronglyTypedNamespace |
可选 String 参数。指定要用于强类型资源的生成类源的命名空间。 如果未指定此参数,则任何强类型资源都会位于全局命名空间中。 |
TLogReadFiles |
可选 ITaskItem[] 只读参数。获取表示读取跟踪日志的项的数组。 |
TLogWriteFiles |
可选 ITaskItem[] 只读参数。获取表示写入跟踪日志的项的数组。 |
ToolArchitecture |
可选 System.String 参数。 用于确定是否需要使用 Tracker.exe 来生成 ResGen.exe。 应解析为 ExecutableType 枚举的成员。 如果为 String.Empty ,请使用启发式方法来确定默认体系结构。 应对 Microsoft.Build.Utilities.ExecutableType 枚举的成员可解析。 |
TrackerFrameworkPath |
可选 String 参数。指定其中包含 FileTracker.dll 的适当 .NET Framework 位置的路径 。 如果设置此参数,则用户应负责确保其传递的 FileTracker.dll 的位数与其要使用的 ResGen.exe 的位数相匹配 。 如果未设置,则任务会基于当前的 .NET Framework 版本决定合适的位置。 |
TrackerLogDirectory |
可选 String 参数。指定用于放置运行此任务生成的跟踪日志的中间目录。 |
TrackerSdkPath |
可选 String 参数。指定包含 Tracker.exe 的适当 Windows SDK 位置的路径 。 如果设置此参数,则用户应负责确保其传递的 Tracker.exe 的位数与其要使用的 ResGen.exe 的位数相匹配 。 如果未设置,则任务会基于当前的 Windows SDK 决定合适的位置。 |
TrackFileAccess |
可选 Boolean 参数。 如果为 true,则使用输入文件的目录来解析相对文件路径。 |
UsePreserializedResources |
可选 Boolean 参数。如果为 true ,则指定使用 PreserializedResourceWriter 而不是 ResourceWriter 序列化非字符串资源,这在 .NET Core 或 .NET 5 或更高版本上不受支持。 |
UseSourcePath |
可选 Boolean 参数。如果为 true ,则指定使用输入文件的目录来解析相对文件路径。 |
备注
由于 .resx
文件可能包含其他资源文件的链接,因此仅通过比较 .resx
和 .resources
文件时间戳的方式来查看是否为最新输出并不可靠。 相反,GenerateResource
任务会跟踪 .resx
文件中的链接,同时也会检查链接文件的时间戳。 这意味着通常不应对包含 GenerateResource
任务的目标使用 Inputs
和 Outputs
属性,因为这样会导致在实际上应运行该任务时跳过此任务。
除上面列出的参数外,此任务还从 TaskExtension 类继承参数,后者自身继承自 Task 类。 有关这些其他参数的列表及其说明的信息,请参阅 TaskExtension 基类。
使用 MSBuild 4.0 生成 .NET 3.5 项目时,x86 资源生成可能会失败。 若要解决此问题,可将目标生成为 AnyCPU 程序集。
参数 UsePreserializedResources
从正常 .NET 生成过程中的属性 $(GenerateResourceUsePreserializedResources)
中获取其值。 默认情况下,此属性在 .NET Core 项目和使用 .NET 5 或更高版本的项目中设置为 true
。 可以将 $(GenerateResourceUsePreserializedResources)
设置为 true
,以允许 .NET SDK 生成面向使用非字符串资源的 .NET Framework 4.6.1 或更高版本的项目。 程序集 System.Resources.Extensions
必须在运行时可用。 它在 .NET Core 3.0 及更高版本和 .NET 5 及更高版本中可用,并且可以通过 PackageReference 在 .NET Framework 4.6.1 或更高版本中使用。|
示例
以下示例使用 GenerateResource
任务从 .resources
项集合指定的文件中生成 Resx
文件。
<GenerateResource
Sources="@(Resx)"
OutputResources="@(Resx->'$(IntermediateOutputPath)%(Identity).resources')">
<Output
TaskParameter="OutputResources"
ItemName="Resources"/>
</GenerateResource>
GenerateResource
任务使用 <EmbeddedResource>
项的 <LogicalName>
元数据来命名嵌入程序集中的资源。
假定程序集命名为 myAssembly,则以下代码会生成一个名为 someQualifier.someResource.resources
的嵌入资源:
<ItemGroup>
<EmbeddedResource Include="myResource.resx">
<LogicalName>someQualifier.someResource.resources</LogicalName>
</EmbeddedResource>
</ItemGroup>
如果没有 <LogicalName>
元数据,则资源会命名为 myAssembly.myResource.resources
。 此示例仅适用于 Visual Basic 和 Visual C# 生成过程。