Referencia de MSBuild para proyectos del SDK de .NET
Esta página es una referencia de las propiedades y los elementos de MSBuild que puede usar para configurar proyectos de .NET.
Nota
Esta página es un trabajo en curso y no muestra todas las propiedades de MSBuild útiles para el SDK de .NET. Para obtener una lista de las propiedades comunes de MSBuild, vea Propiedades comunes de MSBuild.
Propiedades de validación de ensamblado
Estas propiedades y elementos se pasan a la tarea ValidateAssemblies
. Para obtener más información acerca de la validación de ensamblados, consulte Validación de ensamblados.
En esta sección se documentan las siguientes propiedades de MSBuild:
Nota:
Estas propiedades no forman parte del SDK de .NET (todavía). Para usarlas, también debe agregar un PackageReference
a Microsoft.DotNet.ApiCompat.Task.
Además, las siguientes propiedades que se documentan en las Propiedades de validación de paquetes también se aplican a la validación de ensamblados:
- ApiCompatEnableRuleAttributesMustMatch
- ApiCompatEnableRuleCannotChangeParameterName
- ApiCompatExcludeAttributesFile
- ApiCompatGenerateSuppressionFile
- ApiCompatPermitUnnecessarySuppressions
- ApiCompatPreserveUnnecessarySuppressions
- ApiCompatRespectInternals
- ApiCompatSuppressionFile
- ApiCompatSuppressionOutputFile
- NoWarn
- RoslynAssembliesPath
ApiCompatStrictMode
Cuando se establece en true
, la propiedad ApiCompatStrictMode
especifica que se deben realizar comprobaciones de compatibilidad de API en modo estricto.
<PropertyGroup>
<ApiCompatStrictMode>true</ApiCompatStrictMode>
</PropertyGroup>
ApiCompatValidateAssemblies
La propiedad ApiCompatValidateAssemblies
habilita una serie de validaciones en los ensamblados especificados. Para obtener más información, consulte Validación de ensamblados.
<PropertyGroup>
<ApiCompatValidateAssemblies>true</ApiCompatValidateAssemblies>
</PropertyGroup>
Propiedades de atributo de ensamblado
GenerateAssemblyInfo
La propiedad GenerateAssemblyInfo
controla la generación del atributo AssemblyInfo
del proyecto. El valor predeterminado es true
. Use false
para deshabilitar la generación del archivo:
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
El valor de configuración GeneratedAssemblyInfoFile controla el nombre del archivo generado.
Si el valor GenerateAssemblyInfo
es true
, las propiedades del proyecto relacionadas con el paquete se transforman en atributos de ensamblado.
Para obtener más información sobre cómo generar atributos de ensamblado mediante un archivo de proyecto, vea Establecer atributos de ensamblado en un archivo de proyecto.
GeneratedAssemblyInfoFile
La propiedad GeneratedAssemblyInfoFile
define la ruta de acceso relativa o completa del archivo de información de ensamblado generado. Tiene un archivo denominado [nombre-proyecto].AssemblyInfo.[cs|vb] en el directorio $(IntermediateOutputPath)
(normalmente, obj) como valor predeterminado.
<PropertyGroup>
<GeneratedAssemblyInfoFile>assemblyinfo.cs</GeneratedAssemblyInfoFile>
</PropertyGroup>
Propiedades del marco de trabajo
En esta sección se documentan las siguientes propiedades de MSBuild:
TargetFramework
La propiedad TargetFramework
especifica la versión de la plataforma de destino de la aplicación. Para obtener una lista de los monikers de plataforma de destino válidos, vea Plataformas de destino en proyectos de estilo SDK.
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
Para obtener más información, vea Plataformas de destino en proyectos de estilo SDK.
TargetFrameworks
Use la propiedad TargetFrameworks
cuando quiera que la aplicación tenga varias plataformas como destino. Para obtener una lista de los monikers de plataforma de destino válidos, vea Plataformas de destino en proyectos de estilo SDK.
Nota
Esta propiedad se omite si se especifica TargetFramework
(singular).
<PropertyGroup>
<TargetFrameworks>net8.0;net462</TargetFrameworks>
</PropertyGroup>
Para obtener más información, vea Plataformas de destino en proyectos de estilo SDK.
NetStandardImplicitPackageVersion
Nota
Esta propiedad solo se aplica a los proyectos que usan netstandard1.x
. No se aplica a los que usan netstandard2.x
.
Use la propiedad NetStandardImplicitPackageVersion
si quiere especificar una versión del marco que sea inferior a la de la versión del metapaquete. El archivo del proyecto del ejemplo siguiente tiene como destino netstandard1.3
pero usa la versión 1.6.0 de NETStandard.Library
.
<PropertyGroup>
<TargetFramework>netstandard1.3</TargetFramework>
<NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
</PropertyGroup>
Propiedades del paquete
Propiedades descriptivas
Puede especificar propiedades como PackageId
, PackageVersion
, PackageIcon
, Title
y Description
para describir el paquete que se crea a partir del proyecto. Para más información sobre estas y otras propiedades, vea Destino de pack.
<PropertyGroup>
...
<PackageId>ClassLibDotNetStandard</PackageId>
<Version>1.0.0</Version>
<Authors>John Doe</Authors>
<Company>Contoso</Company>
</PropertyGroup>
PackRelease
La propiedad PackRelease
es similar a la propiedad PublishRelease, salvo que cambia el comportamiento predeterminado de dotnet pack
. Esta propiedad se ha introducido en .NET 7.
<PropertyGroup>
<PackRelease>true</PackRelease>
</PropertyGroup>
Nota:
- A partir del SDK de .NET 8, el valor predeterminado de
PackRelease
estrue
. Para obtener más información, vea "dotnet pack" usa la configuración Release. - Solo en el SDK de .NET 7: para usar
PackRelease
en un proyecto que forme parte de una solución de Visual Studio, debe establecer la variable de entornoDOTNET_CLI_ENABLE_PACK_RELEASE_FOR_SOLUTIONS
entrue
(o cualquier otro valor). En el caso de las soluciones que tienen muchos proyectos, establecer esta variable aumenta el tiempo necesario para empaquetar.
Propiedades de validación de paquetes
Estas propiedades y elementos se pasan a la tarea ValidatePackage
. Para obtener más información sobre la validación de paquetes, consulte Introducción a la validación de paquetes.
Para ver las propiedades de la tarea ValidateAssemblies
, consulte Propiedades de validación de ensamblados.
En esta sección se documentan las siguientes propiedades y elementos de MSBuild:
- ApiCompatEnableRuleAttributesMustMatch
- ApiCompatEnableRuleCannotChangeParameterName
- ApiCompatExcludeAttributesFile
- ApiCompatGenerateSuppressionFile
- ApiCompatPermitUnnecessarySuppressions
- ApiCompatPreserveUnnecessarySuppressions
- ApiCompatRespectInternals
- ApiCompatSuppressionFile
- ApiCompatSuppressionOutputFile
- EnablePackageValidation
- EnableStrictModeForBaselineValidation
- EnableStrictModeForCompatibleFrameworksInPackage
- EnableStrictModeForCompatibleTfms
- NoWarn
- PackageValidationBaselineFrameworkToIgnore
- PackageValidationBaselineName
- PackageValidationBaselineVersion
- PackageValidationReferencePath
- RoslynAssembliesPath
ApiCompatEnableRuleAttributesMustMatch
Cuando se establece en true
, la propiedad ApiCompatEnableRuleAttributesMustMatch
habilita la regla de validación que comprueba si los atributos coinciden. El valor predeterminado es false
.
<PropertyGroup>
<ApiCompatEnableRuleAttributesMustMatch>true</ApiCompatEnableRuleAttributesMustMatch>
</PropertyGroup>
ApiCompatEnableRuleCannotChangeParameterName
Cuando se establece en true
, la propiedad ApiCompatEnableRuleCannotChangeParameterName
habilita la regla de validación que comprueba si los nombres de parámetro han cambiado en métodos públicos. El valor predeterminado es false
.
<PropertyGroup>
<ApiCompatEnableRuleCannotChangeParameterName>true</ApiCompatEnableRuleCannotChangeParameterName>
</PropertyGroup>
ApiCompatExcludeAttributesFile
El elemento ApiCompatExcludeAttributesFile
especifica la ruta de acceso a un archivo que contiene atributos que se van a excluir en formato DocId.
<ItemGroup>
<ApiCompatExcludeAttributesFile Include="ApiCompatExcludedAttributes.txt" />
<ApiCompatExcludeAttributesFile Include="ApiCompatBaselineExcludedAttributes.txt" />
</ItemGroup>
ApiCompatGenerateSuppressionFile
La propiedad ApiCompatGenerateSuppressionFile
especifica si se va a generar un archivo de supresión de compatibilidad.
<PropertyGroup>
<ApiCompatGenerateSuppressionFile>true</ApiCompatGenerateSuppressionFile>
</PropertyGroup>
ApiCompatPermitUnnecessarySuppressions
La propiedad ApiCompatPermitUnnecessarySuppressions
especifica si se deben permitir supresiones innecesarias en el archivo de supresión.
El valor predeterminado es false
.
<PropertyGroup>
<ApiCompatPermitUnnecessarySuppressions>true</ApiCompatPermitUnnecessarySuppressions>
</PropertyGroup>
ApiCompatPreserveUnnecessarySuppressions
La propiedad ApiCompatPreserveUnnecessarySuppressions
especifica si se deben conservar las supresiones innecesarias al volver a generar el archivo de supresión. Cuando se vuelve a generar un archivo de supresión existente, se lee su contenido, se deserializa en un conjunto de supresiones y a continuación se almacena en una lista. Es posible que algunas de las supresiones ya no sean necesarias si se ha corregido la incompatibilidad. Cuando las supresiones se serializan de nuevo en el disco, puede optar por mantener todas las expresiones existentes (deserializadas) estableciendo esta propiedad en true
.
El valor predeterminado es false
.
<PropertyGroup>
<ApiCompatPreserveUnnecessarySuppressions>true</ApiCompatPreserveUnnecessarySuppressions>
</PropertyGroup>
ApiCompatRespectInternals
La propiedad ApiCompatRespectInternals
especifica si se debe comprobar la compatibilidad de las API internal
además de las API public
.
<PropertyGroup>
<ApiCompatRespectInternals>true</ApiCompatRespectInternals>
</PropertyGroup>
ApiCompatSuppressionFile
El elemento ApiCompatSuppressionFile
especifica la ruta de acceso a uno o varios archivos de supresión desde los que se va a leer. Si no se especifica, se lee el archivo de supresión <project-directory>/CompatibilitySuppressions.xml (si existe).
<ItemGroup>
<ApiCompatSuppressionFile Include="CompatibilitySuppressions.xml;CompatibilitySuppressions.WasmThreads.xml" />
</ItemGroup>
ApiCompatSuppressionOutputFile
La propiedad ApiCompatSuppressionOutputFile
especifica la ruta de acceso a un archivo de supresión en el que se va a escribir cuando <ApiCompatGenerateSuppressionFile>
es true
. Si no se especifica, se usa el primer elemento ApiCompatSuppressionFile
.
EnablePackageValidation
La propiedad EnablePackageValidation
permite una serie de validaciones en el paquete después de la tarea Pack
. Para más información, consulte Validación de paquetes.
<PropertyGroup>
<EnablePackageValidation>true</EnablePackageValidation>
</PropertyGroup>
EnableStrictModeForBaselineValidation
Cuando se establece en true
, la propiedad EnableStrictModeForBaselineValidation
habilita el modo strict para las comprobaciones de línea base del paquete. El valor predeterminado es false
.
EnableStrictModeForCompatibleFrameworksInPackage
Cuando se establece en true
, la propiedad EnableStrictModeForCompatibleFrameworksInPackage
habilita el modo strict para ensamblados compatibles en función de su marco de destino. El valor predeterminado es false
.
EnableStrictModeForCompatibleTfms
Cuando se establece en true
, la propiedad EnableStrictModeForCompatibleTfms
habilita el modo strict para ensamblados de contrato e implementación para todos los marcos de destino compatibles. El valor predeterminado es true
.
NoWarn
La propiedad NoWarn
especifica los id. de diagnóstico que se van a suprimir.
<PropertyGroup>
<NoWarn>$(NoWarn);PKV0001</NoWarn>
</PropertyGroup>
PackageValidationBaselineFrameworkToIgnore
El elemento PackageValidationBaselineFrameworkToIgnore
especifica un marco de destino que se omitirá desde el paquete de línea base. La cadena de marco debe coincidir exactamente con el nombre de carpeta del paquete de línea base.
<ItemGroup>
<PackageValidationBaselineFrameworkToIgnore Include="netcoreapp2.1" />
</ItemGroup>
PackageValidationBaselineName
La propiedad PackageValidationBaselineName
especifica el nombre del paquete de línea base con el que validar el paquete actual. Si no se especifica, se usa el valor PackageId
.
PackageValidationBaselineVersion
La propiedad PackageValidationBaselineVersion
especifica la versión del paquete de línea base con la que validar el paquete actual.
PackageValidationReferencePath
El elemento PackageValidationReferencePath
especifica la ruta de acceso del directorio donde se puede encontrar el ensamblado de referencia por TFM.
<ItemGroup>
<PackageValidationReferencePath Include="path/to/reference-assembly" TargetFramework="net7.0" />
</ItemGroup>
RoslynAssembliesPath
La propiedad RoslynAssembliesPath
especifica la ruta de acceso al directorio que contiene los ensamblados Microsoft.CodeAnalysis que desea usar. Solo tiene que establecer esta propiedad si desea probar con un compilador más reciente que lo que hay en el SDK.
Propiedades relacionadas con la publicación
En esta sección se documentan las siguientes propiedades de MSBuild:
- AppendRuntimeIdentifierToOutputPath
- AppendTargetFrameworkToOutputPath
- CopyLocalLockFileAssemblies
- ErrorOnDuplicatePublishOutputFiles
- GenerateRuntimeConfigDevFile
- GenerateRuntimeConfigurationFiles
- GenerateSatelliteAssembliesForCore
- IsPublishable
- PreserveCompilationContext
- PreserveCompilationReferences
- ProduceReferenceAssemblyInOutDir
- PublishDocumentationFile
- PublishDocumentationFiles
- PublishReferencesDocumentationFiles
- PublishRelease
- PublishSelfContained
- RollForward
- RuntimeFrameworkVersion
- RuntimeIdentifier
- RuntimeIdentifiers
- SatelliteResourceLanguages
- SelfContained
- UseAppHost
AppendTargetFrameworkToOutputPath
La propiedad AppendTargetFrameworkToOutputPath
controla si el moniker de la plataforma de destino (TFM) se anexa a la ruta de salida (definida por OutputPath). El SDK de .NET anexa automáticamente el marco de destino (y, si está disponible, también el id. del entorno de ejecución) a la ruta de salida. El hecho de establecer AppendTargetFrameworkToOutputPath
en false
impide que el TFM se anexe a la ruta de salida. Sin embargo, sin el TFM en la ruta de salida, es posible que varios artefactos de compilación se sobrescriban entre sí.
Por ejemplo, en el caso de una aplicación de .NET 5, la ruta de salida cambia de bin\Debug\net5.0
a bin\Debug
con la opción de configuración siguiente:
<PropertyGroup>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
AppendRuntimeIdentifierToOutputPath
La propiedad AppendRuntimeIdentifierToOutputPath
controla si el id. del entorno de ejecución (RID) se anexa a la ruta de salida. El SDK de .NET anexa automáticamente el marco de destino (y, si está disponible, también el id. del entorno de ejecución) a la ruta de salida. El hecho de establecer AppendRuntimeIdentifierToOutputPath
en false
impide que el RID se anexe a la ruta de salida.
Por ejemplo, para una aplicación de .NET 5 y un RID de win-x64
, la siguiente configuración cambia la ruta de acceso de salida de bin\Debug\net5.0\win-x64
a bin\Debug\net5.0
:
<PropertyGroup>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
</PropertyGroup>
CopyLocalLockFileAssemblies
La propiedad CopyLocalLockFileAssemblies
es útil para los proyectos de complementos que tienen dependencias de otras bibliotecas. Si establece esta propiedad true
en , las dependencias de paquetes NuGet transitivas se copian en el directorio de salida. Esto significa que puede usar la salida de dotnet build
para ejecutar el complemento en cualquier equipo.
<PropertyGroup>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
El valor predeterminado de CopyLocalLockFileAssemblies
puede variar en función del tipo de salida. Por ejemplo, para las bibliotecas de clases, el valor predeterminado es false
, mientras que para las aplicaciones de consola el valor predeterminado es true
. Puede especificar esta propiedad explícitamente para invalidar el valor predeterminado si es necesario.
Sugerencia
Como alternativa, puede usar dotnet publish
para publicar la biblioteca de clases. Para obtener más información, vea dotnet publish.
ErrorOnDuplicatePublishOutputFiles
La propiedad ErrorOnDuplicatePublishOutputFiles
está relacionada con si el SDK genera el error NETSDK1148 cuando MSBuild detecta archivos duplicados en la salida de la publicación, pero no puede determinar qué archivos se van a quitar. Establezca la propiedad ErrorOnDuplicatePublishOutputFiles
en false
si no quiere que se genere el error.
<PropertyGroup>
<ErrorOnDuplicatePublishOutputFiles>false</ErrorOnDuplicatePublishOutputFiles>
</PropertyGroup>
Esta propiedad se ha introducido en .NET 6.
GenerateRuntimeConfigDevFile
A partir del SDK de .NET 6, el archivo [Appname].runtimesettings.dev.json ya no se genera de forma predeterminada en tiempo de compilación. Si desea que se genere este archivo, establezca la propiedad GenerateRuntimeConfigDevFile
en true
.
<PropertyGroup>
<GenerateRuntimeConfigDevFile>true</GenerateRuntimeConfigDevFile>
</PropertyGroup>
GenerateRuntimeConfigurationFiles
La propiedad GenerateRuntimeConfigurationFiles
controla si las opciones de configuración del entorno de ejecución se copian del archivo runtimeconfig.template.json al archivo [appname].runtimeconfig.json. Para las aplicaciones en las que se necesita un archivo runtimeconfig.json, esto es, aquellas cuyo valor de OutputType
es Exe
, esta propiedad tiene true
como valor predeterminado.
<PropertyGroup>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
</PropertyGroup>
GenerateSatelliteAssembliesForCore
La propiedad GenerateSatelliteAssembliesForCore
controla si los ensamblados satélite se generan mediante csc.exe o Al.exe (Assembly Linker) en proyectos de .NET Framework. (Los proyectos de .NET Core y .NET 5+ siempre usan csc.exe para generar ensamblados satélite). En el caso de los proyectos de .NET Framework, los ensamblados satélite se crean mediante al.exe, de forma predeterminada. Al establecer la propiedad GenerateSatelliteAssembliesForCore
en true
, los ensamblados satélite se crean mediante csc.exe en su lugar. El uso de csc.exe puede ser ventajoso en las siguientes situaciones:
- Quiere usar la opción
deterministic
del compilador C#. - Está limitado por el hecho de que al.exe no tiene soporte para la firma pública y controla AssemblyInformationalVersionAttribute de forma errónea.
<PropertyGroup>
<GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
</PropertyGroup>
IsPublishable
La propiedad IsPublishable
permite ejecutar el destino Publish
. Esta propiedad solo afecta a los procesos que usan archivos .*projy al destino Publish
, como el comando dotnet publish. No afecta a la publicación en Visual Studio, que usa el destino PublishOnly
. El valor predeterminado es true
.
Esta propiedad es útil si se ejecuta dotnet publish
en un archivo de solución, ya que permite la selección automática de los proyectos que deben publicarse.
<PropertyGroup>
<IsPublishable>false</IsPublishable>
</PropertyGroup>
PreserveCompilationContext
La propiedad PreserveCompilationContext
permite a una aplicación creada o publicada compilar más código en tiempo de ejecución con la misma configuración que se utilizó en el momento de la creación. Los ensamblados a los que se hace referencia en el tiempo de compilación se copiarán en el subdirectorio ref del directorio de salida. Los nombres de los ensamblados de referencia se almacenan en el archivo .deps.json de la aplicación junto con las opciones que se pasan al compilador. Puede recuperar esta información mediante las propiedades DependencyContext.CompileLibraries y DependencyContext.CompilationOptions.
Esta funcionalidad la usan principalmente MVC de ASP.NET Core y páginas Razor para admitir la compilación en tiempo de ejecución de archivos Razor.
<PropertyGroup>
<PreserveCompilationContext>true</PreserveCompilationContext>
</PropertyGroup>
PreserveCompilationReferences
La propiedad PreserveCompilationReferences
es similar a la propiedad PreserveCompilationContext, salvo que solo copia los ensamblados a los que se hace referencia en el directorio de publicación, sin el archivo .deps.json.
<PropertyGroup>
<PreserveCompilationReferences>true</PreserveCompilationReferences>
</PropertyGroup>
Para obtener más información, consulte las propiedades del SDK de Razor.
ProduceReferenceAssemblyInOutDir
En .NET 5 y versiones anteriores, los ensamblados de referencia siempre se escriben en el directorio OutDir
. En .NET 6 y versiones posteriores, puede usar la propiedad ProduceReferenceAssemblyInOutDir
para controlar si los ensamblados de referencia se escriben en el directorio OutDir
. El valor predeterminado es false
, y los ensamblados de referencia solo se escriben en el directorio IntermediateOutputPath
. Establezca el valor en true
para escribir ensamblados de referencia en el directorio OutDir
.
<PropertyGroup>
<ProduceReferenceAssemblyInOutDir>true</ProduceReferenceAssemblyInOutDir>
</PropertyGroup>
Para obtener más información, consulte Escritura de ensamblados de referencia en la salida intermedia.
PublishDocumentationFile
Cuando esta propiedad es true
, el archivo de documentación XML del proyecto, si se genera uno, se incluye en la salida de publicación del proyecto. El valor predeterminado de esta propiedad es true
.
Sugerencia
Establezca GenerateDocumentationFile en true
para generar un archivo de documentación XML en tiempo de compilación.
PublishDocumentationFiles
Esta propiedad es una marca de habilitación para otras propiedades que controlan si se copian varios tipos de archivos de documentación XML en el directorio de publicación de manera predeterminada, es decir, PublishDocumentationFile y PublishReferencesDocumentationFiles. Si esas propiedades no están establecidas y esta propiedad está establecida, esas propiedades tendrán como valor predeterminado true
. El valor predeterminado de esta propiedad es true
.
PublishReferencesDocumentationFiles
Cuando esta propiedad es true
, los archivos de documentación XML de las referencias del proyecto se copian en el directorio de publicación, en lugar de simplemente en recursos en tiempo de ejecución, como archivos DLL. El valor predeterminado de esta propiedad es true
.
PublishRelease
La propiedad PublishRelease
informa dotnet publish
para usar la configuración de Release
de forma predeterminada en lugar de la configuración de Debug
. Esta propiedad se ha introducido en .NET 7.
<PropertyGroup>
<PublishRelease>true</PublishRelease>
</PropertyGroup>
Nota:
- A partir del SDK de .NET 8, el valor predeterminado de
PublishRelease
estrue
para los proyectos que tienen como destino .NET 8 o una versión posterior. Para obtener más información, vea "dotnet publish" usa la configuración Release. - Esta propiedad no afecta al comportamiento de
dotnet build /t:Publish
y solo cambia la configuración cuando se publica mediante la CLI de .NET. - Solo en el SDK de .NET 7: para usar
PublishRelease
en un proyecto que forme parte de una solución de Visual Studio, debe establecer la variable de entornoDOTNET_CLI_ENABLE_PUBLISH_RELEASE_FOR_SOLUTIONS
entrue
(o cualquier otro valor). Al publicar una solución con esta variable habilitada, el valor delPublishRelease
proyecto ejecutable tiene prioridad y fluye la nueva configuración predeterminada a cualquier otro proyecto de la solución. Si una solución contiene varios proyectos ejecutables o de nivel superior con valores diferentes dePublishRelease
, la solución no se publicará correctamente. En el caso de las soluciones que tienen muchos proyectos, el uso de esta configuración aumenta el tiempo necesario para publicar.
PublishSelfContained
La propiedad PublishSelfContained
informa a dotnet publish
para publicar una aplicación como una aplicación independiente. Esta propiedad es útil cuando no se puede usar el argumento --self-contained
para el comando dotnet publish, por ejemplo, al publicar en el nivel de solución. En ese caso, puede agregar la propiedad MSBuild PublishSelfContained
a un proyecto o archivo Directory.Build.Props.
Esta propiedad se ha introducido en .NET 7. Es similar a la propiedad SelfContained, salvo que es específica del verbo publish
. Se recomienda usar PublishSelfContained
en lugar de SelfContained
.
<PropertyGroup>
<PublishSelfContained>true</PublishSelfContained>
</PropertyGroup>
RollForward
La propiedad RollForward
controla cómo elige la aplicación un entorno de ejecución cuando hay varias versiones disponibles. Este valor se representa en .runtimeconfig.json como el valor rollForward
.
<PropertyGroup>
<RollForward>LatestMinor</RollForward>
</PropertyGroup>
Establezca RollForward
en uno de los valores siguientes:
Value | Descripción |
---|---|
Minor |
Default si no se especifica. Puesta al día con la versión secundaria mínima superior, si no se encuentra la versión secundaria solicitada. Si se encuentra la versión secundaria solicitada, se usa la directiva LatestPatch . |
Major |
Puesta al día con la siguiente versión principal superior disponible, y con la versión secundaria mínima si no se encuentra la versión principal solicitada. Si se encuentra la versión principal solicitada, se usa la directiva Minor . |
LatestPatch |
Puesta al día con la versión de revisión más alta. Este valor deshabilita la puesta al día de versiones secundarias. |
LatestMinor |
Puesta al día con la versión secundaria más alta, aunque la versión secundaria solicitada esté presente. |
LatestMajor |
Puesta al día con la última versión principal y la última versión secundaria, aunque la versión principal solicitada esté presente. |
Disable |
No se realiza la puesta al día, solo se enlaza a la versión especificada. No se recomienda esta directiva para uso general, ya que deshabilita la capacidad de puesta al día con las revisiones más recientes. Este valor solo se recomienda a efectos de pruebas. |
Para obtener más información, vea Control del comportamiento de la puesta al día.
RuntimeFrameworkVersion
La propiedad RuntimeFrameworkVersion
especifica la versión del entorno de ejecución que se usará al realizar la publicación. Especifique una versión del entorno de ejecución:
<PropertyGroup>
<RuntimeFrameworkVersion>5.0.7</RuntimeFrameworkVersion>
</PropertyGroup>
Al publicar una aplicación dependiente del marco, este valor especifica la versión mínima necesaria. Al publicar una aplicación independiente, este valor especifica la versión exacta necesaria.
RuntimeIdentifier
La propiedad RuntimeIdentifier
permite especificar un único identificador de tiempo de ejecución (RID) para el proyecto. El RID permite publicar una implementación autocontenida.
<PropertyGroup>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
</PropertyGroup>
RuntimeIdentifiers
La propiedad RuntimeIdentifiers
permite especificar una lista delimitada por puntos y coma de identificadores de tiempo ejecución (RID) para el proyecto. Use esta propiedad si tiene que publicar para varios entornos de ejecución. RuntimeIdentifiers
se usa en el momento de la restauración para asegurarse de que los recursos adecuados están en el gráfico.
Sugerencia
RuntimeIdentifier
(singular) puede proporcionar compilaciones más rápidas cuando solo se requiere un entorno de ejecución.
<PropertyGroup>
<RuntimeIdentifiers>win-x64;osx-x64;linux-x64</RuntimeIdentifiers>
</PropertyGroup>
SatelliteResourceLanguages
La propiedad SatelliteResourceLanguages
permite especificar los lenguajes para los que desea conservar los ensamblados de recursos satélite durante la compilación y publicación. Muchos paquetes NuGet incluyen ensamblados satélite de recursos localizados en el paquete principal. En el caso de los proyectos que hacen referencia a estos paquetes NuGet que no requieren recursos localizados, los ensamblados localizados pueden inflar innecesariamente el tamaño de la compilación y la publicación. Al agregar la propiedad SatelliteResourceLanguages
al archivo del proyecto, solo se incluirán en la salida de compilación y publicación los ensamblados localizados para los lenguajes especificados. Por ejemplo, en el siguiente archivo del proyecto, solo se conservarán los ensamblados satélite de recursos en inglés (EE. UU.) y en alemán (Alemania).
<PropertyGroup>
<SatelliteResourceLanguages>en-US;de-DE</SatelliteResourceLanguages>
</PropertyGroup>
Nota:
Debe especificar esta propiedad en el proyecto que hace referencia al paquete NuGet con ensamblados satélite de recursos localizados.
Para especificar varios idiomas como argumento para
dotnet publish
, debe agregar tres pares de comillas alrededor de los identificadores de idioma. Por ejemplo:dotnet msbuild multi.msbuildproj -p:SatelliteResourceLanguages="""de;en"""
SelfContained
La propiedad SelfContained
informa a dotnet build
y dotnet publish
para compilar una aplicación como una aplicación independiente. Esta propiedad es útil cuando no se puede usar el argumento --self-contained
para el comando dotnet, por ejemplo, al publicar en el nivel de solución. En ese caso, puede agregar la propiedad MSBuild SelfContained
a un proyecto o archivo Directory.Build.Props.
Esta propiedad es similar a la propiedad PublishSelfContained. Se recomienda usar PublishSelfContained
en lugar de SelfContained
.
<PropertyGroup>
<SelfContained>true</SelfContained>
</PropertyGroup>
UseAppHost
La propiedad UseAppHost
controla si se crea o no un archivo ejecutable nativo para una implementación. Un archivo ejecutable nativo es obligatorio para las implementaciones independientes. De forma predeterminada, se crea un archivo ejecutable dependiente del marco. Establezca la propiedad UseAppHost
en false
para deshabilitar la generación del archivo ejecutable.
<PropertyGroup>
<UseAppHost>false</UseAppHost>
</PropertyGroup>
Para más información sobre la implementación, consulte Implementación de aplicaciones .NET.
Propiedades relacionadas con el recorte
Hay numerosas propiedades de MSBuild disponibles para ajustar el recorte, que es una característica que recorta el código sin usar de las implementaciones autocontenidas. Estas opciones se describen en detalle en Opciones de recorte. En la tabla siguiente se proporciona una referencia rápida.
Propiedad | Valores | Descripción |
---|---|---|
PublishTrimmed |
true o false |
Controla si el recorte está habilitado durante la publicación. |
TrimMode |
full o partial |
El valor predeterminado es full . Controla la granularidad de recorte. |
SuppressTrimAnalysisWarnings |
true o false |
Controla si se generan advertencias de análisis de recorte. |
EnableTrimAnalyzer |
true o false |
Controla si se generan advertencias de análisis de recorte. Puede habilitar el análisis incluso si PublishTrimmed está establecido en false . |
ILLinkTreatWarningsAsErrors |
true o false |
Controla si las advertencias de recorte se tratan como errores. Por ejemplo, puede que desee establecer esta propiedad en false cuando TreatWarningsAsErrors se establece en true . |
TrimmerSingleWarn |
true o false |
Controla si se muestra una sola advertencia por ensamblado o todas las advertencias. |
TrimmerRemoveSymbols |
true o false |
Controla si todos los símbolos se quitan de una aplicación recortada. |
Propiedades relacionadas con la compilación
En esta sección se documentan las siguientes propiedades de MSBuild:
- ContinuousIntegrationBuild
- CopyDebugSymbolFilesFromPackages
- CopyDocumentationFilesFromPackages
- DisableImplicitFrameworkDefines
- DocumentationFile
- EmbeddedResourceUseDependentUponConvention
- EnablePreviewFeatures
- EnableWindowsTargeting
- GenerateDocumentationFile
- GenerateRequiresPreviewFeaturesAttribute
- OptimizeImplicitlyTriggeredBuild
- DisableRuntimeMarshalling
Las opciones del compilador de C# (como LangVersion
y Nullable
) también se pueden especificar como propiedades de MSBuild en el archivo del proyecto. Para obtener más información, vea Opciones del compilador de C#.
ContinuousIntegrationBuild
La propiedad ContinuousIntegrationBuild
indica si una compilación se está ejecutando en un servidor de integración continua (CI). Cuando se establece en true
, esta propiedad habilita la configuración que solo se aplica a las compilaciones oficiales, en lugar de las compilaciones locales en un equipo para desarrolladores. Por ejemplo, las rutas de acceso de archivo almacenadas se normalizan para las compilaciones oficiales. Pero en un equipo de desarrollo local, el depurador no puede encontrar archivos de código fuente locales si se normalizan las rutas de acceso de archivo.
Nota:
Actualmente, establecer esta propiedad true
en solo funciona si agrega una referencia de paquete de proveedor SourceLink específica o un elemento <SourceRoot Include="$(MyDirectory)" />
. Para obtener más información, consulte incidencia 55860 de dotnet/roslyn.
Puede usar la variable del sistema de CI para establecer condicionalmente la propiedad ContinuousIntegrationBuild
. Por ejemplo, el nombre de la variable para Azure Pipelines es TF_BUILD
:
<PropertyGroup Condition="'$(TF_BUILD)' == 'true'">
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
</PropertyGroup>
Para Acciones de GitHub, el nombre de la variable es GITHUB_ACTIONS
:
<PropertyGroup Condition="'$(GITHUB_ACTIONS)' == 'true'">
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
</PropertyGroup>
CopyDebugSymbolFilesFromPackages
Cuando esta propiedad se establece en true
, todos los archivos de símbolos (también conocidos como archivos PDB) de los elementos PackageReference
del proyecto se copian en la salida de la compilación. Estos archivos pueden proporcionar seguimientos de pila más informativos para las excepciones y hacer que los volcados de memoria y los seguimientos de la aplicación en ejecución sean más fáciles de entender. Sin embargo, incluir estos archivos da como resultado un mayor tamaño del conjunto de implementación.
Esta propiedad se presentó en el SDK de .NET 7.0.100, aunque el valor predeterminado es que no esté especificada.
CopyDocumentationFilesFromPackages
Cuando esta propiedad se establece en true
, todos los archivos de documentación XML generados de los elementos PackageReference
del proyecto se copian en la salida de la compilación. Tenga en cuenta que la habilitación de esta característica dará lugar a un mayor tamaño del conjunto de implementación.
Esta propiedad se presentó en el SDK de .NET 7.0.100, aunque el valor predeterminado es que no esté especificada.
DisableImplicitFrameworkDefines
La propiedad DisableImplicitFrameworkDefines
controla si el SDK genera símbolos de preprocesador para la plataforma y la plataforma de destino para el proyecto de .NET. Cuando esta propiedad se establece en false
o no está establecida (que es el valor predeterminado), se generan símbolos de preprocesador para:
- Marco sin versión (
NETFRAMEWORK
,NETSTANDARD
,NET
) - Marco con versión (
NET48
,NETSTANDARD2_0
,NET6_0
) - Marco con límite mínimo de versión (
NET48_OR_GREATER
,NETSTANDARD2_0_OR_GREATER
,NET6_0_OR_GREATER
)
Para obtener más información sobre los monikers del marco de destino y estos símbolos de preprocesador implícitos, consulte Marcos de destino.
Además, si especifica una plataforma de destino específica del sistema operativo en el proyecto (por ejemplo net6.0-android
), se generan los siguientes símbolos de preprocesador:
- Plataforma sin versión (
ANDROID
,IOS
,WINDOWS
) - Plataforma con versión (
IOS15_1
) - Plataforma con límite mínimo de versión (
IOS15_1_OR_GREATER
)
Para obtener más información sobre los monikers de plataforma de destino específicos del sistema operativo, consulte TFMs específicos del sistema operativo.
Por último, si la plataforma de destino implica la compatibilidad con plataformas de destino anteriores, se emiten símbolos de preprocesador para esas plataformas anteriores. Por ejemplo, net6.0
implica compatibilidad con net5.0
y así sucesivamente de vuelta a .netcoreapp1.0
. Por lo tanto, para cada una de estas plataformas de destino, se definirá el símbolo de marco con límite mínimo de versión.
DocumentationFile
La propiedad DocumentationFile
permite especificar un nombre de archivo para el archivo XML que contiene la documentación de la biblioteca. Para que IntelliSense funcione correctamente con la documentación, el nombre de archivo debe ser el mismo que el nombre del ensamblado y debe estar en el mismo directorio que este. Si no especifica esta propiedad pero establece GenerateDocumentationFile en true
, el nombre del archivo de documentación tiene como valor predeterminado el nombre del ensamblado, pero con una extensión de archivo .xml. Por este motivo, suele ser más fácil omitir esta propiedad y usar en su lugar la propiedad GenerateDocumentationFile.
Si no especifica esta propiedad pero establece GenerateDocumentationFile en false
, el compilador no genera un archivo de documento. Si no especifica esta propiedad y omite la propiedad GenerateDocumentationFile, el compilador genera un archivo de documentación.
<PropertyGroup>
<DocumentationFile>path/to/file.xml</DocumentationFile>
</PropertyGroup>
EmbeddedResourceUseDependentUponConvention
La propiedad EmbeddedResourceUseDependentUponConvention
define si los nombres del archivo de manifiesto del recurso se generan a partir de la información de tipo de los archivos de código fuente que se ubican conjuntamente con archivos de recursos. Por ejemplo, si Form1.resx está en la misma carpera que Form1.cs, y EmbeddedResourceUseDependentUponConvention
se establece en true
, el archivo .resources generado toma su nombre del primer tipo que se define en Form1.cs. Si MyNamespace.Form1
es el primer tipo definido en Form1.cs, el nombre de archivo generado es myNameSpace.Form1.Resources.
Nota
Si se especifican los metadatos LogicalName
, ManifestResourceName
o DependentUpon
para un elemento EmbeddedResource
, el nombre del archivo de manifiesto generado para ese archivo de recurso se basa en esos metadatos.
De forma predeterminada, en un nuevo proyecto .NET destinado a .NET Core 3.0 o una versión posterior, esta propiedad se establece en true
. Si se establece en false
y no se especifica ningún metadato LogicalName
, ManifestResourceName
o DependentUpon
para el elemento EmbeddedResource
del archivo de proyecto, el nombre del archivo de manifiesto del recurso se basa en el espacio de nombres raíz del proyecto y en la ruta de acceso relativa al archivo .resx. Para más información, consulte Denominación de los archivos de manifiesto de recurso.
<PropertyGroup>
<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>
EnablePreviewFeatures
La propiedad EnablePreviewFeatures
define si el proyecto depende de las API o ensamblados que se decoran con el atributo RequiresPreviewFeaturesAttribute. Este atributo se utiliza para indicar que una API o un ensamblado utilizan características que se consideran en versión preliminar para la versión del SDK que se está utilizando. Las características en versión preliminar no se admiten y se pueden quitar en una versión futura. Para habilitar el uso de características en versión preliminar, establezca la propiedad en True
.
<PropertyGroup>
<EnablePreviewFeatures>True</EnablePreviewFeatures>
</PropertyGroup>
Cuando un proyecto contiene esta propiedad establecida en True
, se agrega el siguiente atributo de nivel de ensamblado al archivo AssemblyInfo.cs:
[assembly: RequiresPreviewFeatures]
Un analizador advierte si este atributo está presente en las dependencias de los proyectos en los que EnablePreviewFeatures
no está establecido en True
.
Los autores de bibliotecas que pretenden enviar ensamblados de versión preliminar deben establecer esta propiedad en True
. Si un ensamblado necesita enviarse con una mezcla de API que están en versión preliminar y otras que no lo están, consulte la sección GenerateRequiresPreviewFeaturesAttribute a continuación.
EnableWindowsTargeting
Establezca la propiedad EnableWindowsTargeting
en true
para compilar aplicaciones de Windows (por ejemplo, aplicaciones de Windows Forms o Windows Presentation Foundation) en una plataforma que no sea Windows. Si no establece esta propiedad en true
, obtendrá la advertencia de compilación NETSDK1100. Este error se produce porque los paquetes de destino y del entorno de ejecución no se descargan automáticamente en plataformas que no se admiten. Al establecer esta propiedad, esos paquetes se descargan cuando se usan destinos cruzados.
Nota
Esta propiedad se recomienda actualmente para permitir el desarrollo en plataformas que no son de Windows. Pero cuando la aplicación esté lista para su lanzamiento, debe compilarse en Windows. Al compilar en una plataforma que no es de Windows, es posible que la salida no sea la misma que cuando se compila en Windows. En concreto, el archivo ejecutable no está marcado como una aplicación Windows (lo que significa que siempre iniciará una ventana de consola) y no tendrá un icono insertado.
<PropertyGroup>
<EnableWindowsTargeting>true</EnableWindowsTargeting>
</PropertyGroup>
GenerateDocumentationFile
La propiedad GenerateDocumentationFile
controla si el compilador genera un archivo de documentación XML para la biblioteca. Si establece esta propiedad en true
y no especifica un nombre de archivo a través de la propiedad DocumentationFile, el archivo XML generado se coloca en el mismo directorio de salida que el ensamblado y tiene el mismo nombre de archivo (pero con una extensión .xml).
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
Para más información sobre cómo generar documentación a partir de comentarios de código, consulte Comentarios de documentación XML (C#), Documentación del código con XML (Visual Basic) o Documentación del código con XML (F#).
GenerateRequiresPreviewFeaturesAttribute
La propiedad GenerateRequiresPreviewFeaturesAttribute
está estrechamente relacionada con la propiedad EnablePreviewFeatures. Si su biblioteca utiliza características en versión preliminar pero no desea que todo el ensamblado se marque con el atributo RequiresPreviewFeaturesAttribute, lo que requeriría que cualquier consumidor habilitara las características en versión preliminar, establezca esta propiedad en False
.
<PropertyGroup>
<EnablePreviewFeatures>True</EnablePreviewFeatures>
<GenerateRequiresPreviewFeaturesAttribute>False</GenerateRequiresPreviewFeaturesAttribute>
</PropertyGroup>
Importante
Si establece la propiedad GenerateRequiresPreviewFeaturesAttribute
en False
, debe estar seguro de decorar todas las API públicas que se basan en características en versión preliminar con RequiresPreviewFeaturesAttribute.
OptimizeImplicitlyTriggeredBuild
Para acelerar el tiempo de compilación, las compilaciones que se desencadenan implícitamente por Visual Studio omiten el análisis de código, incluyendo el análisis que admite un valor NULL. Visual Studio desencadena una compilación implícita al ejecutar pruebas, por ejemplo. Sin embargo, las compilaciones implícitas solo se optimizan cuando TreatWarningsAsErrors
no es true
. Si ha establecido TreatWarningsAsErrors
en true
pero todavía desea optimizar las compilaciones desencadenadas implícitamente, puede establecer OptimizeImplicitlyTriggeredBuild
en True
. Para desactivar la optimización de compilación para compilaciones desencadenadas implícitamente, establezca OptimizeImplicitlyTriggeredBuild
en False
.
<PropertyGroup>
<OptimizeImplicitlyTriggeredBuild>True</OptimizeImplicitlyTriggeredBuild>
</PropertyGroup>
DisableRuntimeMarshalling
La propiedad DisableRuntimeMarshalling
le permite especificar que desea deshabilitar la compatibilidad de serialización en runtime para el proyecto. Si esta propiedad se establece en true
, DisableRuntimeMarshallingAttribute se agrega al ensamblado y cualquier interoperabilidad basada en P/Invokes o basada en delegados seguirá las reglas para la serialización en tiempo de ejecución deshabilitada.
<PropertyGroup>
<DisableRuntimeMarshalling>True</DisableRuntimeMarshalling>
</PropertyGroup>
Propiedades de inclusión de elementos predeterminados
En esta sección se documentan las siguientes propiedades de MSBuild:
- DefaultItemExcludesInProjectFolder
- DefaultItemExcludes
- EnableDefaultCompileItems
- EnableDefaultEmbeddedResourceItems
- EnableDefaultItems
- EnableDefaultNoneItems
Para obtener más información, consulte Inclusiones y exclusiones predeterminadas.
DefaultItemExcludes
Use la propiedad DefaultItemExcludes
para definir patrones globales para archivos y carpetas que deban excluirse de los patrones globales de inclusión, exclusión y eliminación. De forma predeterminada, las carpetas ./bin y ./obj se excluyen de los patrones globales.
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);**/*.myextension</DefaultItemExcludes>
</PropertyGroup>
DefaultItemExcludesInProjectFolder
Use la propiedad DefaultItemExcludesInProjectFolder
para definir patrones globales para archivos y carpetas de la carpeta del proyecto que deban excluirse de los patrones globales de inclusión, exclusión y eliminación. De forma predeterminada, las carpetas que empiezan por un punto (.
), como .git y .vs, se excluyen de los patrones globales.
Esta propiedad es muy similar a otra, DefaultItemExcludes
, salvo por el hecho de que esta solo tiene en cuenta los archivos y las carpetas de la carpeta del proyecto. En el caso de que un patrón global pretenda, de forma no intencionada, relacionar elementos de fuera de la carpeta del proyecto con una ruta de acceso relativa, use la propiedad DefaultItemExcludesInProjectFolder
, en lugar de DefaultItemExcludes
.
<PropertyGroup>
<DefaultItemExcludesInProjectFolder>$(DefaultItemExcludesInProjectFolder);**/myprefix*/**</DefaultItemExcludesInProjectFolder>
</PropertyGroup>
EnableDefaultItems
La propiedad EnableDefaultItems
controla si los elementos de compilación, los elementos de los recursos incrustados y los elementos None
se incluyen en el proyecto de forma implícita. El valor predeterminado es true
. Establezca la propiedad EnableDefaultItems
en false
para deshabilitar toda inclusión de archivos implícita.
<PropertyGroup>
<EnableDefaultItems>false</EnableDefaultItems>
</PropertyGroup>
EnableDefaultCompileItems
La propiedad EnableDefaultCompileItems
controla si los elementos de compilación se incluyen en el proyecto de forma implícita. El valor predeterminado es true
. Establezca la propiedad EnableDefaultCompileItems
en false
para deshabilitar la inclusión implícita de los archivos *.cs, así como la de otras extensiones de nombres de archivos.
<PropertyGroup>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
</PropertyGroup>
EnableDefaultEmbeddedResourceItems
La propiedad EnableDefaultEmbeddedResourceItems
controla si los elementos de los recursos incrustados se incluyen en el proyecto de forma implícita. El valor predeterminado es true
. Establezca la propiedad EnableDefaultEmbeddedResourceItems
en false
para deshabilitar la inclusión implícita de los archivos de los recursos incrustados.
<PropertyGroup>
<EnableDefaultEmbeddedResourceItems>false</EnableDefaultEmbeddedResourceItems>
</PropertyGroup>
EnableDefaultNoneItems
La propiedad EnableDefaultNoneItems
controla si los elementos None
(archivos que no tienen ningún rol en el proceso de compilación) se incluyen implícitamente en el proyecto. El valor predeterminado es true
. Establezca la propiedad EnableDefaultNoneItems
en false
para deshabilitar la inclusión implícita de elementos None
.
<PropertyGroup>
<EnableDefaultNoneItems>false</EnableDefaultNoneItems>
</PropertyGroup>
Propiedades de análisis de código
En esta sección se documentan las siguientes propiedades de MSBuild:
- AnalysisLevel
- Categoría<AnalysisLevel>
- AnalysisMode
- Categoría<AnalysisMode>
- CodeAnalysisTreatWarningsAsErrors
- EnableNETAnalyzers
- EnforceCodeStyleInBuild
- _SkipUpgradeNetAnalyzersNuGetWarning
AnalysisLevel
La propiedad AnalysisLevel
permite especificar un conjunto de analizadores de código para que se ejecuten según una versión de .NET. Cada versión de .NET tiene un conjunto de reglas de análisis de código. De ese conjunto, las reglas que están habilitadas de forma predeterminada para esa versión analizan el código. Por ejemplo, si actualiza de .NET 8 a .NET 9, pero no quiere que cambie el conjunto predeterminado de reglas de análisis de código, establezca en AnalysisLevel
8
.
<PropertyGroup>
<AnalysisLevel>8</AnalysisLevel>
</PropertyGroup>
Opcionalmente, puede especificar un valor compuesto para esta propiedad que también especifica cómo habilitar las reglas de forma agresiva. Los valores compuestos adoptan el formato <version>-<mode>
, donde el valor <mode>
es uno de los valores de AnalysisMode. En el ejemplo siguiente se usa la preview
versión de los analizadores de código y se habilita el recommended
conjunto de reglas.
<PropertyGroup>
<AnalysisLevel>preview-recommended</AnalysisLevel>
</PropertyGroup>
Valor predeterminado:
- Si el proyecto tiene como destino .NET 5 o posterior, o si ha agregado la propiedad AnalysisMode, el valor predeterminado es
latest
. - De lo contrario, se omite esta propiedad, a menos que se agregue explícitamente al archivo de proyecto.
En la tabla siguiente se muestran los valores que puede especificar.
Valor | Significado |
---|---|
latest |
Se usan los analizadores de código que se han publicado más recientemente. Este es el valor predeterminado. |
latest-<mode> |
Se usan los analizadores de código que se han publicado más recientemente. El valor <mode> determina las reglas que están habilitadas. |
preview |
Se usan los analizadores de código más recientes, incluso si están en versión preliminar. |
preview-<mode> |
Se usan los analizadores de código más recientes, incluso si están en versión preliminar. El valor <mode> determina las reglas que están habilitadas. |
9.0 |
Se usa el conjunto de reglas que estaba disponible para la versión de .NET 9, incluso si hay reglas más recientes disponibles. |
9.0-<mode> |
Se usa el conjunto de reglas que estaba disponible para la versión de .NET 9, incluso si hay reglas más recientes disponibles. El valor <mode> determina las reglas que están habilitadas. |
9 |
Se usa el conjunto de reglas que estaba disponible para la versión de .NET 9, incluso si hay reglas más recientes disponibles. |
9-<mode> |
Se usa el conjunto de reglas que estaba disponible para la versión de .NET 9, incluso si hay reglas más recientes disponibles. El valor <mode> determina las reglas que están habilitadas. |
8.0 |
Se usa el conjunto de reglas que estaba disponible para .NET 8, incluso si hay reglas más recientes disponibles. |
8.0-<mode> |
Se usa el conjunto de reglas que estaba disponible para .NET 8, incluso si hay reglas más recientes disponibles. El valor <mode> determina las reglas que están habilitadas. |
8 |
Se usa el conjunto de reglas que estaba disponible para .NET 8, incluso si hay reglas más recientes disponibles. |
8-<mode> |
Se usa el conjunto de reglas que estaba disponible para .NET 8, incluso si hay reglas más recientes disponibles. El valor <mode> determina las reglas que están habilitadas. |
7.0 |
Se usa el conjunto de reglas que estaba disponible para .NET 7, incluso si hay reglas más recientes disponibles. |
7.0-<mode> |
Se usa el conjunto de reglas que estaba disponible para .NET 7, incluso si hay reglas más recientes disponibles. El valor <mode> determina las reglas que están habilitadas. |
7 |
Se usa el conjunto de reglas que estaba disponible para .NET 7, incluso si hay reglas más recientes disponibles. |
7-<mode> |
Se usa el conjunto de reglas que estaba disponible para .NET 7, incluso si hay reglas más recientes disponibles. El valor <mode> determina las reglas que están habilitadas. |
Nota:
- Si establece EnforceCodeStyleInBuild
true
en , esta propiedad afecta a las reglas de estilo de código (IDEXXXX) (además de las reglas de calidad de código). - Si establece un valor compuesto para
AnalysisLevel
, no es necesario especificar un valor de AnalysisMode. Sin embargo, si lo hace,AnalysisLevel
tiene prioridad sobreAnalysisMode
. - Esta propiedad no tiene ningún efecto en el análisis de código de los proyectos que no hacen referencia a un SDK de proyecto, por ejemplo, los proyectos de .NET Framework heredados que hacen referencia al paquete NuGet Microsoft.CodeAnalysis.NetAnalyzers.
<Categoría>
Esta propiedad es igual que AnalysisLevel, salvo que solo se aplica a una categoría de reglas de análisis de código específica. Esta propiedad permite usar una versión distinta de los analizadores de código para una categoría específica o bien habilitar o deshabilitar reglas en un nivel diferente al de las otras categorías de reglas. Si omite esta propiedad para una categoría de reglas concreta, su valor predeterminado es AnalysisLevel. Los valores disponibles son los mismos que para AnalysisLevel.
<PropertyGroup>
<AnalysisLevelSecurity>preview</AnalysisLevelSecurity>
</PropertyGroup>
<PropertyGroup>
<AnalysisLevelSecurity>preview-recommended</AnalysisLevelSecurity>
</PropertyGroup>
En la tabla siguiente se muestra el nombre de propiedad de cada categoría de regla.
Nombre de la propiedad | Categoría de regla |
---|---|
<AnalysisLevelDesign> |
Reglas de diseño |
<AnalysisLevelDocumentation> |
Reglas de documentación |
<AnalysisLevelGlobalization> |
Reglas de globalización |
<AnalysisLevelInteroperability> |
Reglas de portabilidad e interoperabilidad |
<AnalysisLevelMaintainability> |
Reglas de mantenimiento |
<AnalysisLevelNaming> |
Reglas de nomenclatura |
<AnalysisLevelPerformance> |
Reglas de rendimiento |
<AnalysisLevelSingleFile> |
Reglas de aplicación de archivo único |
<AnalysisLevelReliability> |
Reglas de confiabilidad |
<AnalysisLevelSecurity> |
Reglas de seguridad |
<AnalysisLevelStyle> |
Todas las reglas de estilo de código (IDEXXXX) |
<AnalysisLevelUsage> |
Reglas de uso |
AnalysisMode
El SDK de .NET incluye todas las reglas "CA" de calidad del código. De forma predeterminada, solo algunas reglas están habilitadas como advertencias de compilación en cada versión de .NET. La propiedad AnalysisMode
le permite personalizar el conjunto de reglas que está habilitado de manera predeterminada. Puede cambiar a un modo de análisis más agresivo en el que puede rechazar las reglas individualmente o a un modo de análisis más conservador en el que puede optar por reglas específicas. Por ejemplo, si quiere habilitar todas las reglas de forma predeterminada como advertencias de compilación, establezca el valor en All
.
<PropertyGroup>
<AnalysisMode>All</AnalysisMode>
</PropertyGroup>
En la siguiente tabla se muestran los valores de opción disponibles. Se muestran en orden creciente del número de reglas que habilitan.
Valor | Descripción |
---|---|
None |
Todas las reglas están deshabilitadas. Puede incluir de forma selectiva reglas individuales para habilitarlas. |
Default |
Modo predeterminado, en el que ciertas reglas están habilitadas como advertencias de compilación, otras están habilitadas como sugerencias del IDE de Visual Studio y el resto están deshabilitadas. |
Minimum |
Modo más agresivo que el modo Default . Algunas sugerencias que se recomiendan encarecidamente para el cumplimiento de la compilación se habilitan como advertencias de compilación. Para ver qué reglas incluye, inspeccione el archivo %ProgramFiles%/dotnet/sdk/[version]/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_[level]_minimum.editorconfig. |
Recommended |
Modo más agresivo que el modo Minimum , donde se habilitan más reglas como advertencias de compilación. Para ver qué reglas incluye, inspeccione el archivo %ProgramFiles%/dotnet/sdk/[version]/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_[level]_recommended.editorconfig. |
All |
Todas las reglas están habilitadas como advertencias de compilación*. Puede excluir de forma selectiva reglas individuales para deshabilitarlas. * Las reglas siguientes no se habilitan al establecer AnalysisMode en All o establecer AnalysisLevel en latest-all : CA1017, CA1045, CA1005, CA1014, CA1060, CA1021 y las reglas del analizador de métricas de código (CA1501, CA1502, CA1505, CA1506 y CA1509). Estas reglas heredadas podrían quedar en desuso en versiones futuras. Sin embargo, todavía es posible habilitarlas individualmente mediante una entrada dotnet_diagnostic.CAxxxx.severity = <severity> . |
Nota:
- Si establece EnforceCodeStyleInBuild
true
en , esta propiedad afecta a las reglas de estilo de código (IDEXXXX) (además de las reglas de calidad de código). - Si usa un valor compuesto para AnalysisLevel (por ejemplo,
<AnalysisLevel>9-recommended</AnalysisLevel>
), puede omitir esta propiedad por completo. Sin embargo, si especifica ambas propiedades,AnalysisLevel
tiene prioridad sobreAnalysisMode
. - Esta propiedad no tiene ningún efecto en el análisis de código de los proyectos que no hacen referencia a un SDK de proyecto, por ejemplo, los proyectos de .NET Framework heredados que hacen referencia al paquete NuGet Microsoft.CodeAnalysis.NetAnalyzers.
<Categoría>AnalysisMode
Esta propiedad es igual que AnalysisMode, salvo que solo se aplica a una categoría de reglas de análisis de código específica. Esta propiedad le permite habilitar o deshabilitar las reglas en un nivel distinto al de las otras categorías de reglas. Si omite esta propiedad para una categoría de reglas concreta, su valor predeterminado es AnalysisMode. Los valores disponibles son los mismos que para AnalysisMode.
<PropertyGroup>
<AnalysisModeSecurity>All</AnalysisModeSecurity>
</PropertyGroup>
En la tabla siguiente se muestra el nombre de propiedad de cada categoría de regla.
Nombre de la propiedad | Categoría de regla |
---|---|
<AnalysisModeDesign> |
Reglas de diseño |
<AnalysisModeDocumentation> |
Reglas de documentación |
<AnalysisModeGlobalization> |
Reglas de globalización |
<AnalysisModeInteroperability> |
Reglas de portabilidad e interoperabilidad |
<AnalysisModeMaintainability> |
Reglas de mantenimiento |
<AnalysisModeNaming> |
Reglas de nomenclatura |
<AnalysisModePerformance> |
Reglas de rendimiento |
<AnalysisModeSingleFile> |
Reglas de aplicación de archivo único |
<AnalysisModeReliability> |
Reglas de confiabilidad |
<AnalysisModeSecurity> |
Reglas de seguridad |
<AnalysisModeStyle> |
Todas las reglas de estilo de código (IDEXXXX) |
<AnalysisModeUsage> |
Reglas de uso |
CodeAnalysisTreatWarningsAsErrors
La propiedad CodeAnalysisTreatWarningsAsErrors
le permite configurar si las advertencias de análisis de calidad del código (CAxxxx) se deben tratar como advertencias e interrumpir la compilación. Si usa la marca -warnaserror
al compilar los proyectos, las advertencias de análisis de calidad del código de .NET también se tratan como errores. Si no quiere que las advertencias de análisis de calidad del código se traten como errores, puede establecer la propiedad CodeAnalysisTreatWarningsAsErrors
de MSBuild en false
en el archivo del proyecto.
<PropertyGroup>
<CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors>
</PropertyGroup>
EnableNETAnalyzers
De forma predeterminada, el análisis de calidad del código de .NET está habilitado para los proyectos que tienen como destino .NET 5 o una versión posterior. Si desarrolla con el SDK de .NET 5+, puede establecer la propiedad EnableNETAnalyzers
en true
para permitir el análisis de código de .NET en los proyectos de estilo SDK que tienen como destino versiones anteriores de .NET. Para deshabilitar el análisis de código en cualquier proyecto, establezca esta propiedad en false
.
<PropertyGroup>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
</PropertyGroup>
Nota
Esta propiedad se aplica específicamente a los analizadores integrados en el SDK de .NET 5+. No se debe usar cuando se instala un paquete NuGet de análisis de código.
EnforceCodeStyleInBuild
El análisis del estilo del código de .NET está deshabilitado de forma predeterminada en la compilación para todos los proyectos de .NET. Puede habilitar el análisis del estilo del código para los proyectos de .NET estableciendo la propiedad EnforceCodeStyleInBuild
en true
.
<PropertyGroup>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
</PropertyGroup>
Todas las reglas de estilo del código configuradas como advertencias o errores se ejecutarán en la compilación y notificarán infracciones.
_SkipUpgradeNetAnalyzersNuGetWarning
La propiedad _SkipUpgradeNetAnalyzersNuGetWarning
le permite configurar si recibe una advertencia si usa analizadores de código de un paquete NuGet obsoleto en comparación con los analizadores de código en el SDK de .NET más reciente. La advertencia es similar a la siguiente:
El SDK de .NET tiene analizadores más recientes con la versión «6.0.0» que la versión «5.0.3» del paquete «Microsoft.CodeAnalysis.NetAnalyzers». Actualice o quite esta referencia de paquete.
Para quitar esta advertencia y seguir usando la versión de analizadores de código en el paquete NuGet, establezca _SkipUpgradeNetAnalyzersNuGetWarning
en true
en el archivo del proyecto.
<PropertyGroup>
<_SkipUpgradeNetAnalyzersNuGetWarning>true</_SkipUpgradeNetAnalyzersNuGetWarning>
</PropertyGroup>
Propiedades de configuración del entorno de ejecución
Puede configurar algunos comportamientos del entorno de ejecución si especifica las propiedades de MSBuild en el archivo de proyecto de la aplicación. Para obtener información sobre otros métodos de configuración del comportamiento del entorno de ejecución, consulte Configuración del entorno de ejecución.
- AutoreleasePoolSupport
- ConcurrentGarbageCollection
- InvariantGlobalization
- PredefinedCulturesOnly
- RetainVMGarbageCollection
- ServerGarbageCollection
- ThreadPoolMaxThreads
- ThreadPoolMinThreads
- TieredCompilation
- TieredCompilationQuickJit
- TieredCompilationQuickJitForLoops
- TieredPGO
- UseWindowsThreadPool
AutoreleasePoolSupport
La propiedad AutoreleasePoolSupport
configura si cada subproceso administrado recibe un elemento NSAutoreleasePool implícito cuando se ejecuta en una plataforma macOS compatible. Para obtener más información, consulte AutoreleasePool
para subprocesos administrados.
<PropertyGroup>
<AutoreleasePoolSupport>true</AutoreleasePoolSupport>
</PropertyGroup>
ConcurrentGarbageCollection
La propiedad ConcurrentGarbageCollection
configura si está habilitada la recolección de elementos no utilizados en segundo plano (simultánea). Establezca el valor en false
para deshabilitar la recolección de elementos no utilizados en segundo plano. Para obtener más información, vea Recolección de elementos no utilizados en segundo plano.
<PropertyGroup>
<ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>
</PropertyGroup>
InvariantGlobalization
La propiedad InvariantGlobalization
configura si la aplicación se ejecuta en modo invariable de globalización, lo que significa que no tiene acceso a datos específicos de la referencia cultural. Establezca el valor en true
para ejecutar en el modo invariable de globalización. Para obtener más información, consulte Modo invariable.
<PropertyGroup>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
PredefinedCulturesOnly
En .NET 6 y versiones posteriores, la propiedad PredefinedCulturesOnly
determina si las aplicaciones pueden crear referencias culturales distintas a la referencia cultural invariable si está habilitado el modo invariable de globalización. El valor predeterminado es true
. Establezca el valor en false
para permitir la creación de cualquier nueva referencia cultural en el modo invariable de globalización.
<PropertyGroup>
<PredefinedCulturesOnly>false</PredefinedCulturesOnly>
</PropertyGroup>
Para obtener más información, vea Creación de referencia cultural y asignación de casos en el modo invariable de globalización.
RetainVMGarbageCollection
La propiedad RetainVMGarbageCollection
configura el recolector de elementos no utilizados para colocar los segmentos de memoria eliminados en una lista en espera para su uso futuro o para liberarlos. Al establecer el valor en true
, se indica al recolector de elementos no utilizados que coloque los segmentos en una lista en espera. Para obtener más información, vea Retain VM (Conservar VM).
<PropertyGroup>
<RetainVMGarbageCollection>true</RetainVMGarbageCollection>
</PropertyGroup>
ServerGarbageCollection
La propiedad ServerGarbageCollection
configura si la aplicación usa la recolección de elementos no utilizados de estación de trabajo o la de servidor. Establezca el valor en true
para usar la recolección de elementos no utilizados de servidor. Para obtener más información, vea Estación de trabajo frente a servidor.
<PropertyGroup>
<ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>
ThreadPoolMaxThreads
La propiedad ThreadPoolMaxThreads
configura el número máximo de subprocesos para el grupo de subprocesos de trabajo. Para obtener más información, consulte Máximo de subprocesos.
<PropertyGroup>
<ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
</PropertyGroup>
ThreadPoolMinThreads
La propiedad ThreadPoolMinThreads
configura el número mínimo de subprocesos para el grupo de subprocesos de trabajo. Para obtener más información, consulte Mínimo de subprocesos.
<PropertyGroup>
<ThreadPoolMinThreads>4</ThreadPoolMinThreads>
</PropertyGroup>
TieredCompilation
La propiedad TieredCompilation
configura si el compilador Just-In-Time (JIT) usa la compilación en niveles. Establezca el valor en false
para deshabilitar la compilación en niveles. Para obtener más información, vea Compilación en niveles.
<PropertyGroup>
<TieredCompilation>false</TieredCompilation>
</PropertyGroup>
TieredCompilationQuickJit
La propiedad TieredCompilationQuickJit
configura si el compilador JIT usa JIT rápido. Establezca el valor en false
para deshabilitar JIT rápido. Para obtener más información, vea JIT rápido.
<PropertyGroup>
<TieredCompilationQuickJit>false</TieredCompilationQuickJit>
</PropertyGroup>
TieredCompilationQuickJitForLoops
La propiedad TieredCompilationQuickJitForLoops
configura si el compilador JIT usa JIT rápido en métodos que contienen bucles. Establezca el valor en true
para habilitar JIT rápido en métodos que contienen bucles. Para obtener más información, vea JIT rápido para bucles.
<PropertyGroup>
<TieredCompilationQuickJitForLoops>true</TieredCompilationQuickJitForLoops>
</PropertyGroup>
TieredPGO
La propiedad TieredPGO
controla si está habilitada la optimización guiada por perfiles (PGO) dinámica o en capas. Establezca el valor en true
para habilitar PGO en capas. Para más información, vea Optimización guiada por perfiles.
<PropertyGroup>
<TieredPGO>true</TieredPGO>
</PropertyGroup>
UseWindowsThreadPool
La propiedad UseWindowsThreadPool
configura si la administración de subprocesos del grupo de subprocesos se delega al grupo de subprocesos de Windows (solo Windows). El valor predeterminado es false
, en cuyo caso se usa el grupo de subprocesos de .NET. Para obtener más información, consulte Grupo de subprocesos de Windows.
<PropertyGroup>
<UseWindowsThreadPool>true</UseWindowsThreadPool>
</PropertyGroup>
Propiedades relacionadas con referencias
En esta sección se documentan las siguientes propiedades de MSBuild:
- AssetTargetFallback
- DisableImplicitFrameworkReferences
- DisableTransitiveFrameworkReferenceDownloads
- DisableTransitiveProjectReferences
- ManagePackageVersionsCentrally
- Propiedades relacionadas con la restauración
- UseMauiEssentials
- ValidateExecutableReferencesMatchSelfContained
AssetTargetFallback
La propiedad AssetTargetFallback
permite especificar versiones de la plataforma compatibles adicionales para las referencias de proyectos y los paquetes NuGet. Por ejemplo, si se especifica una dependencia de paquete mediante PackageReference
pero ese paquete no contiene recursos compatibles con el valor TargetFramework
del proyecto, entra en juego la propiedad AssetTargetFallback
. La compatibilidad del paquete al que se hace referencia se vuelve a comprobar con cada plataforma de destino que se especifica en AssetTargetFallback
. Esta propiedad reemplaza la propiedad en desuso PackageTargetFallback
.
Puede establecer la propiedad AssetTargetFallback
en una o varias versiones de plataforma de destino.
<PropertyGroup>
<AssetTargetFallback>net461</AssetTargetFallback>
</PropertyGroup>
DisableImplicitFrameworkReferences
La propiedad DisableImplicitFrameworkReferences
controla los elementos FrameworkReference
implícitos cuando el destino es .NET Core 3.0 y versiones posteriores. Cuando el destino es .NET Core 2.1 o .NET Standard 2.0 y versiones anteriores, controla los elementos PackageReference implícitos en los paquetes de un metapaquete. (Un metapaquete es un paquete basado en marco compuesto únicamente por dependencias de otros paquetes). Esta propiedad también controla las referencias implícitas, como System
y System.Core
, cuando el destino establecido es .NET Framework.
Establezca esta propiedad en true
para deshabilitar los elementos implícitos FrameworkReference o PackageReference. Si establece esta propiedad en true
, puede agregar referencias explícitas solo a las plataformas o paquetes que necesite.
<PropertyGroup>
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
</PropertyGroup>
DisableTransitiveFrameworkReferenceDownloads
Establezca la propiedad DisableTransitiveFrameworkReferenceDownloads
en true
para evitar la descarga de paquetes de destino y del entorno de ejecución adicionales a los que el proyecto no hace referencia directamente.
<PropertyGroup>
<DisableTransitiveFrameworkReferenceDownloads>true</DisableTransitiveFrameworkReferenceDownloads>
</PropertyGroup>
DisableTransitiveProjectReferences
La propiedad DisableTransitiveProjectReferences
controla las referencias implícitas del proyecto. Establezca esta propiedad en true
para deshabilitar elementos de ProjectReference
implícitos. Deshabilitar las referencias implícitas del proyecto da como resultado un comportamiento no transitivo similar al sistema de proyectos heredado.
Cuando esta propiedad es true
, tiene un efecto similar al de establecer PrivateAssets="All"
en todas las dependencias del proyecto dependiente.
Si establece esta propiedad en true
, puede agregar referencias explícitas solo a los proyectos que necesite.
<PropertyGroup>
<DisableTransitiveProjectReferences>true</DisableTransitiveProjectReferences>
</PropertyGroup>
ManagePackageVersionsCentrally
La propiedad ManagePackageVersionsCentrally
se introdujo en .NET 7. Al establecerla en true
en un archivo Directory.Packages.props en la raíz del repositorio, puede administrar dependencias comunes en los proyectos desde una ubicación. Agregue versiones para las dependencias comunes del paquete mediante elementos PackageVersion
en el archivo Directory.Packages.props. A continuación, en los archivos de proyecto individuales, puede omitir atributos Version
de cualquier elemento PackageReference
que haga referencia a paquetes administrados centralmente.
Archivo Directory.Packages.props de ejemplo:
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
...
<ItemGroup>
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
</ItemGroup>
Archivo del proyecto individual:
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" />
</ItemGroup>
Para obtener más información, vea Administración central de paquetes (CPM).
Propiedades relacionadas con la restauración
La restauración de un paquete al que se hace referencia instala todas sus dependencias directas y todas las dependencias de esas dependencias. Puede personalizar la restauración de paquetes especificando propiedades como RestorePackagesPath
y RestoreIgnoreFailedSources
. Para más información sobre estas y otras propiedades, vea Destino de restore.
<PropertyGroup>
<RestoreIgnoreFailedSource>true</RestoreIgnoreFailedSource>
</PropertyGroup>
UseMauiEssentials
Establezca la propiedad UseMauiEssentials
en true
para declarar una referencia explícita a un proyecto o paquete que depende de MAUI Essentials. Esta configuración garantiza que el proyecto extraiga la referencia de marco conocida correcta para MAUI Essentials. Si el proyecto hace referencia a un proyecto que usa MAUI Essentials, pero no establece esta propiedad en true
, es posible que encuentre la advertencia de compilación NETSDK1186
.
<PropertyGroup>
<UseMauiEssentials>true</UseMauiEssentials>
</PropertyGroup>
ValidateExecutableReferencesMatchSelfContained
La propiedad ValidateExecutableReferencesMatchSelfContained
se puede usar para deshabilitar los errores relacionados con las referencias de proyecto ejecutable. Si .NET detecta que un proyecto ejecutable autocontenido hace referencia a un proyecto ejecutable dependiente del marco, o viceversa, genera errores NETSDK1150 y NETSDK1151, respectivamente. Para evitar estos errores cuando la referencia es intencionada, establezca la propiedad ValidateExecutableReferencesMatchSelfContained
en false
.
<PropertyGroup>
<ValidateExecutableReferencesMatchSelfContained>false</ValidateExecutableReferencesMatchSelfContained>
</PropertyGroup>
WindowsSdkPackageVersion
La propiedad WindowsSdkPackageVersion
se puede usar para invalidar la versión del paquete de destino Windows SDK. Esta propiedad se introdujo en .NET 5 y reemplaza el uso del elemento FrameworkReference
para este propósito.
<PropertyGroup>
<WindowsSdkPackageVersion>10.0.19041.18</WindowsSdkPackageVersion>
</PropertyGroup>
Nota:
No se recomienda invalidar la versión de Windows SDK, ya que los paquetes de destino de Windows SDK se incluyen con el SDK de .NET 5+. En su lugar, para hacer referencia al paquete más reciente de Windows SDK, actualice la versión del SDK de .NET. Esta propiedad solo se debe usar en ocasiones excepcionales, como el uso de paquetes de versión preliminar o la necesidad de invalidar la versión de C#/WinRT.
Propiedades relacionadas con la ejecución
Las siguientes propiedades se usan para iniciar una aplicación con el comando dotnet run
:
RunArguments
La RunArguments
propiedad define los argumentos que se pasan a la aplicación cuando se ejecuta.
<PropertyGroup>
<RunArguments>-mode dryrun</RunArguments>
</PropertyGroup>
Sugerencia
Puede especificar los argumentos adicionales que se pasarán a la aplicación mediante la opción --
para dotnet run
.
RunWorkingDirectory
La propiedad RunWorkingDirectory
define el directorio de trabajo en el que se iniciará el proceso. Puede ser una ruta de acceso absoluta o relativa al directorio del proyecto. Si no se especifica un directorio, se usa OutDir
como directorio de trabajo.
<PropertyGroup>
<RunWorkingDirectory>c:\temp</RunWorkingDirectory>
</PropertyGroup>
Propiedades relacionadas con el SDK
En esta sección se documentan las siguientes propiedades de MSBuild:
SdkAnalysisLevel
Introducido en .NET 9, la SdkAnalysisLevel
propiedad se puede usar para configurar el modo en que se usan las herramientas de SDK estrictas . Le ayuda a administrar los niveles de advertencia del SDK en situaciones en las que es posible que no pueda anclar SDK a través de global.json u otros medios. Puede usar esta propiedad para indicar a un SDK más reciente que se comporte como si fuera un SDK anterior, con respecto a una herramienta o característica específica, sin tener que instalar el SDK anterior.
Los valores permitidos de esta propiedad son bandas de características del SDK, por ejemplo, 8.0.100 y 8.0.400. El valor predeterminado es la banda de características del SDK del SDK en ejecución. Por ejemplo, para SDK 9.0.102, el valor sería 9.0.100. (Para obtener información sobre cómo se versiona el SDK de .NET, consulte Cómo se versiona .NET).
<PropertyGroup>
<SdkAnalysisLevel>8.0.400</SdkAnalysisLevel>
</PropertyGroup>
Para obtener más información, consulte SDK Analysis Level Property and Usage (Propiedad y uso del nivel de análisis del SDK).
Prueba de las propiedades relacionadas con el proyecto
En esta sección se documentan las siguientes propiedades de MSBuild:
- IsTestProject
- IsTestingPlatformApplication
- Enable[NugetPackageNameWithoutDots]
- EnableAspireTesting
- EnablePlaywright
- EnableMSTestRunner
- EnableNUnitRunner
- GenerateTestingPlatformEntryPoint
- TestingPlatformCaptureOutput
- TestingPlatformCommandLineArguments
- TestingPlatformDotnetTestSupport
- TestingPlatformShowTestsFailure
- TestingExtensionsProfile
- UseVSTest
IsTestProject
La IsTestProject
propiedad indica que un proyecto es un proyecto de prueba. Cuando esta propiedad está establecida true
en , la validación para comprobar si el proyecto hace referencia a un archivo ejecutable autocontenida está deshabilitado. Esto se debe a que los proyectos de prueba tienen una OutputType
api de Exe
pero normalmente llaman a API en un ejecutable al que se hace referencia en lugar de intentar ejecutarse. Además, si un proyecto hace referencia a un proyecto en IsTestProject
el que se establece true
en , el proyecto de prueba no se valida como referencia ejecutable.
Esta propiedad se necesita principalmente para el dotnet test
escenario y no tiene ningún impacto al usar vstest.console.exe.
Nota:
Si el proyecto especifica el SDK de MSTest, no es necesario establecer esta propiedad. Se establece automáticamente. De forma similar, esta propiedad se establece automáticamente para los proyectos que hacen referencia al paquete NuGet Microsoft.NET.Test.Sdk vinculado a VSTest.
IsTestingPlatformApplication
Cuando el proyecto hace referencia al paquete Microsoft.Testing.Platform.MSBuild , el valor IsTestingPlatformApplication
true
en (que también es el valor predeterminado si no se especifica) hace lo siguiente:
- Genera el punto de entrada al proyecto de prueba.
- Genera el archivo de configuración.
- Detecta las extensiones.
Al establecer la propiedad en , false
se deshabilita la dependencia transitiva en el paquete. Una dependencia transitiva es cuando un proyecto que hace referencia a otro proyecto que hace referencia a un paquete determinado se comporta como si hace referencia al paquete. Normalmente, esta propiedad false
se establece en en un proyecto que no es de prueba que hace referencia a un proyecto de prueba. Para obtener más información, consulte el error CS8892.
Si el proyecto de prueba hace referencia a MSTest, NUnit o xUnit, esta propiedad se establece en el mismo valor que EnableMSTestRunner, EnableNUnitRunner o UseMicrosoftTestingPlatformRunner
(para xUnit).
Enable[NugetPackageNameWithoutDots]
Use una propiedad con el patrón Enable[NugetPackageNameWithoutDots]
para habilitar o deshabilitar las extensiones Microsoft.Testing.Platform.
Por ejemplo, para habilitar la extensión de volcado de memoria (paquete NuGet Microsoft.Testing.Extensions.CrashDump), establezca en EnableMicrosoftTestingExtensionsCrashDump
true
.
Para obtener más información, vea Habilitar o deshabilitar extensiones.
EnableAspireTesting
Al usar el SDK del proyecto MSTest, puede usar la EnableAspireTesting
propiedad para incluir todas las dependencias y directivas predeterminadas using
que necesita para realizar pruebas con Aspire
y MSTest
. Esta propiedad está disponible en MSTest 3.4 y versiones posteriores.
Para obtener más información, consulte Prueba con .NET Aspire.
EnablePlaywright
Al usar el SDK del proyecto MSTest, puede usar la EnablePlaywright
propiedad para incluir todas las dependencias y directivas predeterminadas using
que necesita para realizar pruebas con Playwright
y MSTest
. Esta propiedad está disponible en MSTest 3.4 y versiones posteriores.
Para obtener más información, consulte Playwright.
EnableMSTestRunner
La EnableMSTestRunner
propiedad habilita o deshabilita el uso del ejecutor de MSTest. El ejecutor de MSTest es una alternativa ligera y portátil a VSTest. Esta propiedad está disponible en MSTest 3.2 y versiones posteriores.
Nota:
Si el proyecto especifica el SDK de MSTest, no es necesario establecer esta propiedad. Se establece automáticamente.
EnableNUnitRunner
La EnableNUnitRunner
propiedad habilita o deshabilita el uso del ejecutor de NUnit. El ejecutor NUnit es una alternativa ligera y portátil a VSTest. Esta propiedad está disponible en NUnit3TestAdapter en la versión 5.0 y posteriores.
GenerateTestingPlatformEntryPoint
Al establecer la GenerateTestingPlatformEntryPoint
propiedad para false
deshabilitar la generación automática del punto de entrada del programa en un proyecto de prueba msTest, NUnit o xUnit. Es posible que desee establecer esta propiedad false
en cuando defina manualmente un punto de entrada o cuando haga referencia a un proyecto de prueba desde un archivo ejecutable que también tenga un punto de entrada.
Para obtener más información, consulte el error CS8892.
Para controlar la generación del punto de entrada en un proyecto de VSTest, use la GenerateProgramFile
propiedad .
TestingPlatformCaptureOutput
La TestingPlatformCaptureOutput
propiedad controla si todas las salidas de la consola que escribe un ejecutable de prueba se capturan y ocultan al usuario cuando se usan dotnet test
para ejecutar Microsoft.Testing.Platform
pruebas. De forma predeterminada, la salida de la consola está oculta. Esta salida incluye el banner, la información de versión y la información de prueba con formato. Establezca esta propiedad en false
para mostrar esta información junto con la salida de MSBuild.
Para obtener más información, consulte Mostrar la salida completa de la plataforma.
TestingPlatformCommandLineArguments
La TestingPlatformCaptureOutput
propiedad permite especificar argumentos de línea de comandos para la aplicación de prueba cuando se usan dotnet test
para ejecutar Microsoft.Testing.Platform
pruebas. En el siguiente fragmento de código de archivo de proyecto se muestra un ejemplo.
<PropertyGroup>
...
<TestingPlatformCommandLineArguments>--minimum-expected-tests 10</TestingPlatformCommandLineArguments>
</PropertyGroup>
TestingPlatformDotnetTestSupport
La TestingPlatformDotnetTestSupport
propiedad le permite especificar si VSTest se usa cuando se usa dotnet test
para ejecutar pruebas. Si establece esta propiedad true
en , VSTest está deshabilitado y todas las Microsoft.Testing.Platform
pruebas se ejecutan directamente.
Si tiene una solución que contiene proyectos de prueba de VSTest, así como proyectos de MSTest, NUnit o XUnit, debe realizar una llamada por modo (es decir, dotnet test
no ejecutará pruebas de VSTest y las plataformas más recientes en una sola llamada).
TestingPlatformShowTestsFailure
La TestingPlatformShowTestsFailure
propiedad permite controlar si se notifica un único error o todos los errores de una prueba con error cuando se usan dotnet test
para ejecutar pruebas. De forma predeterminada, se resumen los errores de prueba en un archivo .log y se notifica un único error por proyecto de prueba a MSBuild. Para mostrar errores por prueba con errores, establezca esta propiedad true
en en el archivo del proyecto.
TestingExtensionsProfile
Al usar el SDK del proyecto MSTest, la TestingExtensionsProfile
propiedad le permite seleccionar un perfil que se va a usar. En la tabla siguiente se muestran los valores permitidos.
Valor | Descripción |
---|---|
Default |
Habilita las extensiones recomendadas para esta versión de MSTest.SDK. |
None |
No hay extensiones habilitadas. |
AllMicrosoft |
Habilite todas las extensiones enviadas por Microsoft (incluidas las extensiones con una licencia restrictiva). |
Para obtener más información, consulte Perfil de ejecutor de MSTest.
UseVSTest
Establezca la UseVSTest
propiedad en true
para cambiar del ejecutor de MSTest al ejecutor de VSTest al usar el SDK de proyectos de MSTest.
Propiedades relacionadas con el hospedaje
En esta sección se documentan las siguientes propiedades de MSBuild:
AppHostDotNetSearch
La AppHostDotNetSearch
propiedad configura cómo el ejecutable nativo generado para una aplicación buscará una instalación de .NET. Esta propiedad solo afecta al ejecutable generado en la publicación, no a la compilación.
<PropertyGroup>
<AppHostDotNetSearch>Global</AppHostDotNetSearch>
</PropertyGroup>
En la tabla siguiente se enumeran los valores válidos. Puede especificar varios valores, separados por punto y coma.
Valor | Significado |
---|---|
AppLocal |
Carpeta del ejecutable de la aplicación |
AppRelative |
Ruta de acceso relativa al archivo ejecutable de la aplicación tal y como se especifica en AppHostRelativeDotNet |
EnvironmentVariables |
Valor de las variables de DOTNET_ROOT[_<arch>] entorno |
Global |
Ubicaciones de instalación global registradas y predeterminadas |
Esta propiedad se introdujo en .NET 9.
AppHostRelativeDotNet
La AppHostRelativeDotNet
propiedad permite especificar una ruta de acceso relativa para que el ejecutable de la aplicación busque la instalación de .NET cuando esté configurada para hacerlo. Establecer la AppHostRelativeDotNet
propiedad implica que AppHostDotNetSearch
es AppRelative
. Esta propiedad solo afecta al ejecutable generado en la publicación, no a la compilación.
<PropertyGroup>
<AppHostRelativeDotNet>./relative/path/to/runtime</AppHostRelativeDotNet>
</PropertyGroup>
Esta propiedad se introdujo en .NET 9.
EnableComHosting
La propiedad EnableComHosting
indica que un ensamblado proporciona un servidor COM. Al establecer EnableComHosting
en true
también implica que EnableDynamicLoading es true
.
<PropertyGroup>
<EnableComHosting>True</EnableComHosting>
</PropertyGroup>
Para obtener más información, vea Exposición de componentes de .NET en COM.
EnableDynamicLoading
La propiedad EnableDynamicLoading
indica que un ensamblado es un componente cargado dinámicamente. El componente podría ser una biblioteca de COM o una biblioteca que no es de COM que se puede usar desde un host nativo o como complemento. Establecer esta propiedad en true
tiene los efectos siguientes:
- Se genera un archivo runtimeconfig.json.
- RollForward se establece en
LatestMinor
. - Las referencias de NuGet se copian localmente.
<PropertyGroup>
<EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>
Propiedades del archivo generado
Las siguientes propiedades se refieren al código de los archivos generados:
DisableImplicitNamespaceImports
La propiedad DisableImplicitNamespaceImports
se puede usar para deshabilitar importaciones de espacios de nombres implícitos en proyectos de Visual Basic que tienen como destino .NET 6 o una versión posterior. Los espacios de nombres implícitos son los espacios de nombres predeterminados que se importan globalmente en un proyecto de Visual Basic. Establezca esta propiedad en true
para deshabilitar las importaciones de espacios de nombres implícitos.
<PropertyGroup>
<DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports>
</PropertyGroup>
ImplicitUsings
La propiedad ImplicitUsings
se puede usar para habilitar y deshabilitar directivas de global using
implícitas en proyectos de C# que tienen como destino .NET 6 o una versión posterior y en proyectos de C# 10 o una versión posterior. Cuando la característica está habilitada, el SDK de .NET agrega directivas de global using
para un conjunto de espacios de nombres predeterminados basados en el tipo de SDK del proyecto. Establezca esta propiedad en true
o enable
para habilitar las directivas de global using
implícitas. Para deshabilitar las directivas de global using
implícitas, quite la propiedad o establézcala en false
o disable
.
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
Nota:
En las plantillas para nuevos proyectos de C# que tienen como destino .NET 6 o una versión posterior, ImplicitUsings
se establece en enable
de manera predeterminada.
Para definir una directiva global using
explícita, agregue un elemento Using.
Elementos
Los elementos de MSBuild son entradas al sistema de compilación. Los elementos se especifican de acuerdo con su tipo, que es el nombre del elemento. Por ejemplo, Compile
y Reference
son dos tipos de elementos comunes. El SDK de .NET pone a disposición los siguientes tipos de elementos adicionales:
Puede usar cualquiera de los atributos de elementos estándar, por ejemplo, Include
y Update
, en dichos elementos. Use Include
para agregar un nuevo elemento; y Update
, para modificar uno existente. Por ejemplo, Update
se suele usar para modificar un elemento que el SDK de .NET ha agregado de forma implícita.
AssemblyMetadata
El elemento AssemblyMetadata
especifica un atributo de ensamblado AssemblyMetadataAttribute de par clave-valor. Los metadatos Include
se convierten en la clave y los metadatos Value
se convierten en el valor.
<ItemGroup>
<AssemblyMetadata Include="Serviceable" Value="True" />
</ItemGroup>
InternalsVisibleTo
El elemento InternalsVisibleTo
genera un atributo de ensamblado InternalsVisibleToAttribute para el ensamblado de confianza especificado.
<ItemGroup>
<InternalsVisibleTo Include="MyProject.Tests" />
</ItemGroup>
Si el ensamblado de confianza está firmado, puede especificar metadatos Key
opcionales para especificar su clave pública completa. Si no especifica metadatos Key
y $(PublicKey)
está disponible, se usa esa clave. De lo contrario, no se agrega ninguna clave pública al atributo.
FrameworkReference
El elemento FrameworkReference
define una referencia a un marco compartido .NET.
El atributo Include
especifica el identificador del marco.
El fragmento del archivo del proyecto del ejemplo siguiente hace referencia al marco compartido Microsoft.AspNetCore.App.
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
PackageReference
El elemento PackageReference
define una referencia a un paquete NuGet.
El atributo Include
especifica el identificador del paquete. El atributo Version
especifica la versión o el intervalo de versiones. Para obtener más información sobre cómo especificar una versión mínima, una máxima, un intervalo o una coincidencia exacta, vea Intervalos de versiones.
El fragmento del archivo del proyecto del ejemplo siguiente hace referencia al paquete System.Runtime.
<ItemGroup>
<PackageReference Include="System.Runtime" Version="4.3.0" />
</ItemGroup>
También puede controlar los recursos de las dependencias mediante metadatos como PrivateAssets
.
<ItemGroup>
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
Para obtener más información, vea Referencias de paquete en un archivo del proyecto.
TrimmerRootAssembly
El elemento TrimmerRootAssembly
permite excluir del recorte un ensamblado. El recorte es el proceso de quitar de una aplicación empaquetada las partes que no se han usado del tiempo de ejecución. En algunos casos, el recorte podría quitar de forma incorrecta las referencias necesarias.
El siguiente código XML excluye del recorte el ensamblado System.Security
.
<ItemGroup>
<TrimmerRootAssembly Include="System.Security" />
</ItemGroup>
Para obtener más información, consulte Opciones de recorte.
Uso
El elemento Using
le permite incluir un espacio de nombres globalmente en todo el proyecto de C#, de modo que no tenga que agregar una directiva de using
para el espacio de nombres en la parte superior de los archivos de origen. Este elemento es similar al elemento Import
que se puede usar para el mismo propósito en los proyectos de Visual Basic. Esta propiedad está disponible a partir de .NET 6.
<ItemGroup>
<Using Include="My.Awesome.Namespace" />
</ItemGroup>
También puede usar el elemento Using
para definir directivas using <alias>
y using static <type>
globales.
<ItemGroup>
<Using Include="My.Awesome.Namespace" Alias="Awesome" />
</ItemGroup>
Por ejemplo:
<Using Include="Microsoft.AspNetCore.Http.Results" Alias="Results" />
emiteglobal using Results = global::Microsoft.AspNetCore.Http.Results;
<Using Include="Microsoft.AspNetCore.Http.Results" Static="True" />
emiteglobal using static global::Microsoft.AspNetCore.Http.Results;
Para más información, consulte las directivas de alias using
y las directivas using static <type>
.
Metadatos de elementos
Además de los atributos de los elementos de MSBuild estándar, el SDK de .NET pone a disposición las siguientes etiquetas de metadatos de los elementos:
CopyToPublishDirectory
Los metadatos de CopyToPublishDirectory
relativos a un elemento de MSBuild controlan cuándo se copia el elemento en el directorio de publicación. Los valores permitidos son PreserveNewest
, que solo copia el elemento si ha cambiado; Always
, que siempre lo copia; y Never
, que nunca lo hace. Desde el punto de vista del rendimiento, PreserveNewest
es preferible porque permite una compilación incremental.
<ItemGroup>
<None Update="appsettings.Development.json" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" />
</ItemGroup>
LinkBase
En el caso de un elemento situado fuera del directorio del proyecto y sus subdirectorios, el destino de publicación usa los metadatos de Link del elemento para determinar dónde se debe copiar este. Link
también determina cómo se muestran los elementos situados fuera del árbol del proyecto en la ventana Explorador de soluciones de Visual Studio.
Si no se especifica Link
para un elemento situado fuera del cono del proyecto, este tiene %(LinkBase)\%(RecursiveDir)%(Filename)%(Extension)
como valor predeterminado. LinkBase
permite especificar una carpeta base razonable para los elementos situados fuera del cono del proyecto. La jerarquía de carpetas de la carpeta base se conserva por medio de RecursiveDir
. Si no se especifica LinkBase
, se omite de la ruta a Link
.
<ItemGroup>
<Content Include="..\Extras\**\*.cs" LinkBase="Shared"/>
</ItemGroup>
En la imagen siguiente, se ilustra cómo se muestra globalmente un archivo incluido en el elemento anterior Include
en el Explorador de soluciones.