WriteCodeFragment — zadanie

Generuje plik kodu tymczasowego na podstawie określonego wygenerowanego fragmentu kodu. Nie usuwa pliku.

Parametry

W poniższej tabeli opisano parametry WriteCodeFragment zadania.

Parametr Opis
AssemblyAttributes Opcjonalny ITaskItem[] parametr.

Opis atrybutów do zapisu. Wartość elementu Include jest pełną nazwą typu atrybutu, na przykład System.AssemblyVersionAttribute.

Każda metadana jest parą name-value parametru. Przyjmuje się, że parametry mają być typu String w programie MSBuild 17.6 lub starszym, ale w programie MSBuild 17.7 lub nowszym można również używać typów innych niż String te, które są częścią mscorlibprogramu . Można na przykład użyć true wartości logicznych, false liczb całkowitych, wyliczenia i typów zmiennoprzecinkowych. Typ jest automatycznie wnioskowany ze składni. W przypadku typu innego mscorlibniż , określ typ parametru, podając wartości metadanych w formularzu {parameter}_TypeName.

Niektóre atrybuty zezwalają tylko na argumenty konstruktora pozycyjnego. Można jednak użyć takich argumentów w dowolnym atrybucie. Aby ustawić atrybuty konstruktora pozycyjnego, użyj nazw metadanych przypominających _Parameter1, _Parameter2i tak dalej. Nie można pominąć indeksu parametrów.

W programie MSBuild 17.7 lub nowszym można również określić metadane formularza {parameter}_IsLiteral , aby poinstruować zadanie o interpretowaniu tekstu wartości parametru w taki sposób, jak to jest, bez otaczania cudzysłowami (tak jak w przypadku wartości ciągu domyślnego).
Language Wymagany parametr interfejsu String.

Określa język kodu do wygenerowania.

Language może być dowolnym językiem, dla którego jest dostępny dostawca CodeDom, na przykład "C#" lub "VisualBasic". Emitowany plik będzie miał domyślne rozszerzenie nazwy pliku dla tego języka.
OutputDirectory Opcjonalny ITaskItem parametr.

Określa folder docelowy wygenerowanego kodu, zazwyczaj folder pośredni.
OutputFile Opcjonalny ITaskItem parametr wyjściowy.

Określa ścieżkę wygenerowanego pliku. Jeśli ten parametr jest ustawiany przy użyciu nazwy pliku, folder docelowy jest poprzedzony nazwą pliku. Jeśli jest ona ustawiona przy użyciu katalogu głównego, folder docelowy zostanie zignorowany.

Jeśli ten parametr nie jest ustawiony, nazwa pliku wyjściowego jest folderem docelowym, dowolną nazwą pliku i domyślnym rozszerzeniem nazwy pliku dla określonego języka.

Uwagi

Oprócz parametrów wymienionych w tabeli to zadanie dziedziczy parametry z TaskExtension klasy, która sama dziedziczy po Task klasie. Aby uzyskać listę tych dodatkowych parametrów i ich opisy, zobacz TaskExtension, klasa bazowa.

To zadanie nie jest zwykle używane bezpośrednio w kodzie użytkownika.

Generowanie atrybutów na poziomie zestawu

W programie MSBuild 17.7 lub nowszym to zadanie zostało zaktualizowane w celu obsługi większej gamy typów parametrów dla atrybutów na poziomie zestawu. Program MSBuild 17.6 i starsze wersje są obsługiwane tylko String jako typ parametru dla atrybutów na poziomie zestawu. W programie MSBuild 17.7 lub nowszym można utworzyć dowolny atrybut zestawu platformy .NET, nie tylko tych, których parametry były typami ciągów, jak we wcześniejszych wersjach programu MSBuild.

Aby na przykład zdefiniować atrybut CLSCompliant(true)na poziomie zestawu , który używa parametru logicznego, można użyć następującej składni:

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

Wygenerowany kod zależy od języka docelowego. W przypadku języka C#będzie to wyglądać następująco:

[assembly: System.CLSCompliantAttribute(true)]

Typy zdefiniowane w programie mscorlib są automatycznie wnioskowane, takie jak wartość logiczna w poprzednim przykładzie. Metadane formularza {parameter}_TypeName można zdefiniować, aby określić typy, których nie można wywnioskować.

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

Kod wygenerowany w języku C# jest następujący:

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

W przypadku bardziej skomplikowanych wartości parametrów można użyć polecenia {parameter}_IsLiteral.

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

Poprzedni przykład tworzy następujący atrybut zestawu w języku C#:

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

Można użyć dowolnej składni, która normalnie będzie dozwolona w deklaracji atrybutu w języku projektu. W przypadku parametru tablicy można użyć kodu podobnego do następującego:

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

W przypadku używania składnia IsLiteraljest interpretowana przez odpowiedni kompilator i dlatego jest specyficzna dla języka. Jeśli masz sytuacje, w których więcej niż jeden język współużytkuje ten sam plik importu MSBuild i/lub pliki projektu, może być konieczne użycie składni warunkowej, aby upewnić się, że kod kompiluje się z odpowiednim językiem specyficznym dla projektu.

Uwaga

Składnia opisana w tej sekcji (_TypeName i _IsLiteral sufiksach) nie jest obsługiwana w języku F#.

Przykład

Typowy przypadek użycia zadania WriteCodeFragment znajduje się w obiekcie docelowym, który generuje plik, który definiuje atrybut na poziomie zestawu i dodaje go do kompilacji. Po AssemblyAttribute zdefiniowaniu można wywołać WriteCodeFragment zadanie, tak jak w poniższym kodzie.

<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>

Parametr ma określoną nazwę pliku. Jeśli OutputFile nie zostanie określona, nazwa pliku jest generowana losowo. Ponadto, aby dodać wygenerowany plik do kompilacji, Compile lista elementów jest podawana jako dane wyjściowe. Plik jest również dodawany do listy elementów, dzięki czemu jest usuwany po uruchomieniu FileWritesClean elementu docelowego.

Zobacz też