WriteCodeFragment - задача

Создает временный файл кода из указанного созданного фрагмента кода. Не удаляет этот файл.

Параметры

В следующей таблице приводятся параметры задачи WriteCodeFragment.

Параметр Описание
AssemblyAttributes Необязательный параметр ITaskItem[].

Описание атрибутов для записи. Значение элемента Include — это полное имя типа атрибута, например System.AssemblyVersionAttribute.

Каждая метаданные — это пара "имя-значение" параметра. Предполагается, что параметры имеют тип String в MSBuild 17.6 и более ранних версий, но в MSBuild 17.7 и более поздних версий можно также использовать типы, отличные String от этих mscorlib. Например, можно использовать true логические false значения, целые числа, перечисления и типы с плавающей запятой. Тип автоматически выводится из синтаксиса. Для типа, который не указан 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 и (или) файлами проекта, возможно, потребуется использовать условный синтаксис, чтобы обеспечить компиляцию кода с соответствующим языком для конкретного проекта.

Примечание.

Синтаксис, описанный в этом разделе (_TypeName и _IsLiteral суффиксы), не поддерживается в F#.

Пример

Типичный вариант использования задачи 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 объекта.

См. также