GenerateResource 任务
在 .txt
和 .resx
(基于 XML 的资源格式)文件和公共语言运行时二进制 .resources
文件之间进行转换,这些文件可以嵌入在运行时二进制可执行文件中或编译为附属程序集。 此任务通常用于将 .txt
或 .resx
文件转换为 .resources
文件。
GenerateResource
任务在功能上类似于 resgen.exe。
谨慎
可以使用 BinaryFormatter
序列化 .resx
文件中的资源,不安全。 仅在你信任的生成过程中包含这些 .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 5 或更高版本的 .NET Core 项目和项目中设置为 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
任务从 Resx
项集合指定的文件中生成 .resources
文件。
<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>
<WithCulture>false</WithCulture>
</EmbeddedResource>
</ItemGroup>
如果没有 <LogicalName>
元数据,资源将命名为 myAssembly.myResource.resources
。 此示例仅适用于 Visual Basic 和 Visual C# 生成过程。