WriteCodeFragment 任务

根据指定的生成代码片段,生成临时代码文件。 不会删除该文件。

参数

下表描述了 WriteCodeFragment 任务的参数。

参数 说明
AssemblyAttributes 可选 ITaskItem[] 参数。

要编写的属性的说明。 项目 Include 值是属性的完整类型名称,例如 System.AssemblyVersionAttribute

每个元数据都是参数的名称/值对。 在 MSBuild 17.6 及更早版本中,假定参数的类型为 String,但在 MSBuild 17.7 及更高版本中,还可以使用属于 mscorlib 的除 String 以外的类型。 例如,可以使用 truefalse 布尔值、整数、枚举和浮点类型。 类型是从语法中自动推断的。 对于不属于 mscorlib 的类型,请通过提供 {parameter}_TypeName 形式的元数据值来指定参数的类型。

某些属性只允许使用位置构造函数参数。 但可在任何属性中使用这些参数。 若要设置位置构造函数属性,请使用类似于 _Parameter1_Parameter2 等元数据名称。 不能跳过参数索引。

在 MSBuild 17.7 或更高版本中,还可以指定 {parameter}_IsLiteral 形式的元数据,以指示任务按原样解释参数值文本,而不使用引号引起来(就像在默认情况下对字符串值所做的那样)。
Language 必选 String 参数。

指定要生成的代码的语言。

Language 可以是任何可用于 CodeDom 提供程序的语言,例如“C#”或“VisualBasic”。发出的文件将具有该语言的默认文件扩展名。
OutputDirectory 可选 ITaskItem 参数。

指定生成代码的目标文件夹,通常为中间文件夹。
OutputFile 可选 ITaskItem 输出参数。

指定已生成文件的路径。 如果使用文件名设置此参数,则会将目标文件夹附加在文件名前。 如果使用根进行设置,则会忽略目标文件夹。

如果未设置此参数,则输出文件名将为目标文件夹、任意文件名称和指定语言的默认文件扩展名。

注解

除了具有表中列出的参数外,此任务还将从本身继承自 Task 类的 TaskExtension 类继承参数。 有关这些其他参数的列表及其说明的信息,请参阅 TaskExtension 基类

此任务通常不会直接在用户代码中使用。

生成程序集级属性

在 MSBuild 17.7 及更高版本中,此任务已更新以支持程序集级属性的多种参数类型。 MSBuild 17.6 及更早版本仅支持将 String 用作程序集级属性的参数类型。 使用 MSBuild 17.7 及更高版本,可以构造任何 .NET 程序集属性,而不仅仅是参数为字符串类型的属性,如 MSBuild 的早期版本中那样。

例如,若要定义使用布尔参数的程序集级属性 CLSCompliant(true),可以使用以下语法:

<ItemGroup>
    <AssemblyAttribute Include="System.CLSCompliantAttribute">
        <_Parameter1>true</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

生成的代码取决于目标语言。 对于 C#,它将如下所示:

[assembly: System.CLSCompliantAttribute(true)]

mscorlib 中定义的类型会自动推断,如上一示例中的布尔值。 可以定义 {parameter}_TypeName 形式的元数据,以指定无法推断的类型。

<ItemGroup>
    <AssemblyAttribute Include="Microsoft.Owin.OwinStartup">
        <_Parameter1>Microsoft.Examples.Startup</_Parameter1>
        <_Parameter1_TypeName>System.Type</_Parameter1_TypeName>
    </AssemblyAttribute>
</ItemGroup>

在 C# 中生成的代码如下所示:

[assembly: Microsoft.Owin.OwinStartup(typeof(Microsoft.Examples.Startup))]

对于更复杂的参数值,可以使用 {parameter}_IsLiteral

<ItemGroup>
    <AssemblyAttribute Include="NUnit.Framework.Parallelizable">
        <_Parameter1>NUnit.Framework.ParallelScope.Fixtures</_Parameter1>
        <_Parameter1_IsLiteral>true</_Parameter1_IsLiteral>
    </AssemblyAttribute>
</ItemGroup>

前面的示例在 C# 中生成以下程序集属性:

[assembly: NUnit.Framework.Parallelizable(NUnit.Framework.ParallelScope.Fixtures)]

可以使用项目语言的属性声明中通常允许的任何语法。 对于数组参数,可以使用如下所示的代码:

<ItemGroup>
  <AssemblyAttribute Include="TestAttribute">
    <_Parameter1>new int[] { 1, 3, 5 } /* odd numbers */</_Parameter1>
    <_Parameter1_IsLiteral>true</_Parameter1_IsLiteral>
  </AssemblyAttribute>
</ItemGroup>

使用 IsLiteral 时,语法由相应的编译器解释,因此它是特定于语言的。 如果有多种语言共享相同的 MSBuild 导入文件和/或项目文件,则可能需要使用条件语法来确保代码使用相关的项目特定语言进行编译。

注意

F# 中不支持本节中所述的语法(_TypeName_IsLiteral 后缀)。

示例

任务 WriteCodeFragment 的典型用例位于生成一个文件的目标中,该文件定义程序集级属性并将其添加到生成中。 定义后 AssemblyAttribute ,可以调用任务 WriteCodeFragment ,如以下代码所示。

<Target Name="AddAssemblyVersion" BeforeTargets="Build">
  <ItemGroup>
     <AssemblyAttribute Include="AssemblyVersion">
       <_Parameter1>1.2.3.4</_Parameter1>
     </AssemblyAttribute>
  </ItemGroup>
  <WriteCodeFragment AssemblyAttributes="@(AssemblyAttribute)"
                     Language="C#"
                     OutputDirectory="$(IntermediateOutputPath)"
                     OutputFile="AssemblyVersion.cs">
    <Output TaskParameter="OutputFile" ItemName="Compile" />
    <Output TaskParameter="OutputFile" ItemName="FileWrites" />
  </WriteCodeFragment>
</Target>

给定 OutputFile 特定文件名;如果未指定,则会随机生成文件名。 此外,若要将生成的文件添加到生成中,项 Compile 列表将作为输出提供。 文件也会添加到 FileWrites 项列表中,以便在运行目标时 Clean 将其删除。

另请参阅