WriteCodeFragment 工作

從指定產生的程式碼片段來產生暫存程式碼檔。 不會刪除該檔案。

參數

下表說明 WriteCodeFragment 工作的參數。

參數 描述
AssemblyAttributes 選擇性的 ITaskItem[] 參數。

要撰寫之屬性的描述。 項目 Include 值是屬性的完整類型名稱,例如 System.AssemblyVersionAttribute

每個中繼資料都是參數的名稱/值組。 在 MSBuild 17.6 和較早版本中,參數假設為 String 類型,但在 MSBuild 17.7 和更新版本中,您也可以使用 String (屬於 mscorlib 的一部分) 以外的類型。 例如,您可以使用 truefalse 布林值、整數、列舉和浮點類型。 型別可從語法自動推斷。 對於不在 mscorlib 中的類型,請提供 {parameter}_TypeName 形式的中繼資料值,藉此指定參數的類型。

有些屬性只允許位置建構函式引數。 不過,您可以在任何屬性中使用這類引數。 若要設定位置建構函式屬性,請使用與 _Parameter1_Parameter2 等類似的中繼資料名稱。 參數索引不能予以跳過。

在 MSBuild 17.7 或更新版本中,您也可以指定 {parameter}_IsLiteral 形式的中繼資料,指示工作按原樣解譯參數值文字,而不用引號括住 (如字串值的預設案例所示)。
Language 必要的 String 參數。

指定要產生之程式碼的語言。

Language 可以是 CodeDom 提供者所提供的任何語言 (例如 "C#" 或 "VisualBasic")。發出的檔案會具有該語言的預設副檔名。
OutputDirectory 選擇性的 ITaskItem 參數。

指定所產生程式碼的目的地資料夾,通常是中繼資料夾。
OutputFile 選擇性的 ITaskItem 輸出參數。

指定已產生檔案的路徑。 如果使用檔案名稱來設定此參數,則會在檔案名稱的前面加上目的地資料夾。 如果使用根設定它,則會忽略目的地資料夾。

如果未設定此參數,輸出檔案名稱就是目的地資料夾、任意檔案名稱,以及所指定語言的預設副檔名。

備註

除了具有表格中所列的參數之外,此工作也繼承 TaskExtension 類別的參數,而該類別本身又繼承 Task 類別。 如需這些其他參數的清單及其描述,請參閱 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 將其刪除。

另請參閱