Compartir a través de


WriteCodeFragment (tarea)

Genera un archivo de código temporal a partir del fragmento de código generado especificado. No elimina el archivo.

Parámetros

En la siguiente tabla se describen los parámetros de la tarea WriteCodeFragment .

Parámetro Descripción
AssemblyAttributes Parámetro ITaskItem[] opcional.

Descripción de los atributos que se van a escribir. El valor Include del elemento es el nombre de tipo completo del atributo, por ejemplo, System.AssemblyVersionAttribute.

Cada fragmento de metadatos es el par nombre-valor de un parámetro. Se supone que los parámetros son de tipo String en MSBuild 17.6 y versiones anteriores, pero en MSBuild 17.7 y versiones posteriores, también puede usar tipos distintos de String que forman parte de mscorlib. Por ejemplo, puede usar los valores booleanos true yfalse, enteros, enumeraciones y tipos de punto flotante. El tipo se deduce automáticamente de la sintaxis. Para un tipo que no está en mscorlib, especifique el tipo para el parámetro proporcionando valores de metadatos con el formato {parameter}_TypeName.

Algunos atributos solo permiten argumentos de constructor posicional. Aun así, puede usar estos argumentos en cualquier atributo. Para establecer atributos de constructor posicional, use nombres de metadatos que sean similares a _Parameter1, _Parameter2, etc. No se puede omitir un índice de parámetro.

En MSBuild 17.7 o posterior, también puede especificar metadatos del formulario {parameter}_IsLiteral para indicar a la tarea que interprete el texto del valor del parámetro tal cual, sin rodear comillas (como se hace en el caso predeterminado de los valores de cadena).
Language Parámetro String requerido.

Especifica el lenguaje del código que se va a generar.

Language puede ser cualquier lenguaje para el que esté disponible un proveedor CodeDOM, por ejemplo, "C#" o "VisualBasic." El archivo emitido tendrá la extensión de nombre de archivo predeterminada para ese lenguaje.
OutputDirectory Parámetro ITaskItem opcional.

Especifica la carpeta de destino del código generado, normalmente la carpeta intermedia.
OutputFile Parámetro de salida ITaskItem opcional.

Especifica la ruta de acceso del archivo que se ha generado. Si este parámetro se establece mediante el uso de un nombre de archivo, la carpeta de destino se antepone al nombre de archivo. Si se establece mediante el uso de una raíz, se omite la carpeta de destino.

Si no se establece este parámetro, el nombre del archivo de salida es la carpeta de destino, un nombre de archivo arbitrario y la extensión de nombre de archivo predeterminada para el lenguaje especificado.

Comentarios

Además de tener los parámetros que se enumeran en la tabla, esta tarea hereda los parámetros de la clase TaskExtension, que a su vez hereda de la clase Task. Para obtener una lista de estos parámetros adicionales y sus descripciones, consulte TaskExtension base class.

Esta tarea no se usa normalmente directamente en el código de usuario.

Generación de atributos de nivel de ensamblado

En MSBuild 17.7 y versiones posteriores, esta tarea se actualizó para admitir una mayor variedad de tipos de parámetros para los atributos de nivel de ensamblado. MSBuild 17.6 y versiones anteriores solo se admite String como un tipo de parámetro para los atributos de nivel de ensamblado. Con MSBuild 17.7 y versiones posteriores, puede construir cualquier atributo de ensamblado de .NET, no solo aquellos cuyos parámetros eran tipos de cadena, como en versiones anteriores de MSBuild.

Por ejemplo, para definir el atributo de nivel de ensamblado CLSCompliant(true), que usa un parámetro booleano, puede usar la sintaxis siguiente:

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

El código generado depende del idioma de destino. Para C#, sería el siguiente:

[assembly: System.CLSCompliantAttribute(true)]

Los tipos definidos en mscorlib se deducen automáticamente, como el booleano en el ejemplo anterior. Puede definir metadatos del formulario {parameter}_TypeName para especificar tipos que no se pueden deducir.

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

El código generado en C# es el siguiente:

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

Para valores de parámetros más complicados, puede usar {parameter}_IsLiteral.

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

En el ejemplo anterior se genera el siguiente atributo de ensamblado en C#:

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

Puede usar cualquier sintaxis que normalmente se permita en una declaración de atributo en el lenguaje del proyecto. Para un parámetro de matriz, puede usar código como el siguiente:

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

Cuando se usa IsLiteral, el compilador adecuado interpreta la sintaxis y, por tanto, es específica del lenguaje. Si tiene situaciones en las que más de un lenguaje comparte los mismos archivos de importación o archivos de proyecto de MSBuild, es posible que tenga que usar la sintaxis condicional para asegurarse de que el código se compila con el lenguaje específico del proyecto correspondiente.

Nota:

La sintaxis descrita en esta sección (_TypeName y _IsLiteral sufijos) no se admite en F#.

Ejemplo

Un caso de uso típico para la WriteCodeFragment tarea está en un destino que genera un archivo que define un atributo de nivel de ensamblado y lo agrega a la compilación. Con AssemblyAttribute definido, puede invocar la WriteCodeFragment tarea como en el código siguiente.

<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 se asigna un nombre de archivo específico; si no se especifica, se genera aleatoriamente un nombre de archivo. Además, para agregar el archivo generado a la compilación, la Compile lista de elementos se proporciona como salida. El archivo también se agrega a la FileWrites lista de elementos, de modo que se elimina cuando se ejecuta el Clean destino.

Consulte también