Compartir a través de


Integración de Visual Studio (MSBuild)

Visual Studio hospeda MSBuild para cargar y compilar proyectos administrados. Dado que MSBuild es responsable del proyecto, casi cualquier proyecto en formato MSBuild se puede usar correctamente en Visual Studio, incluso si el proyecto lo creó una herramienta diferente y tiene un proceso de compilación personalizado.

En este artículo se describen aspectos específicos del hospedaje de MSBuild de Visual Studio que se debe tener en cuenta al personalizar proyectos y archivos .targets que desea cargar y compilar en Visual Studio. Esto le ayudará a asegurarse de que las características de Visual Studio, como IntelliSense y la depuración, funcionen en su proyecto personalizado.

Para obtener información sobre los proyectos de C++, vea Archivos de proyecto.

Extensiones de nombre de archivo del proyecto

MSBuild.exe reconoce cualquier extensión de nombre de archivo de proyecto que coincida con el patrón .*proj. Sin embargo, Visual Studio solo reconoce un subconjunto de estas extensiones de nombre de archivo de proyecto, que determinan el sistema de proyectos específico del lenguaje que cargará el proyecto. Visual Studio no tiene un sistema de proyectos basado en MSBuild independiente del lenguaje.

Por ejemplo, el sistema de proyectos de C# carga archivos .csproj , pero Visual Studio no puede cargar un archivo .xxproj . Un archivo de proyecto para archivos de código fuente en un lenguaje arbitrario debe usar la misma extensión que los archivos de proyecto de Visual Basic o C# que se van a cargar en Visual Studio.

Como alternativa, se admite la extensión *.msbuildproj.

Nombres de destino conocidos

Al hacer clic en el comando Compilar en Visual Studio, se ejecutará el destino predeterminado en el proyecto. A menudo, este destino también se denomina Build. Al elegir el comando Recompilar o Limpiar , se intentará ejecutar un destino con el mismo nombre en el proyecto. Al hacer clic en Publicar , se ejecutará un destino denominado PublishOnly en el proyecto.

Configuraciones y plataformas

Las configuraciones se representan en proyectos de MSBuild por propiedades agrupadas en un PropertyGroup elemento que contiene un Condition atributo . Visual Studio examina estas condiciones para crear una lista de configuraciones y plataformas de proyecto que se van a mostrar. Para extraer correctamente esta lista, las condiciones deben tener un formato similar al siguiente:

Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
Condition=" '$(Configuration)' == 'Release' " 
Condition=" '$(Something)|$(Configuration)|$(SomethingElse)' == 'xxx|Debug|yyy' "

Visual Studio examina las condiciones en los elementos PropertyGroup, ItemGroup, Import, propiedad y elemento para este propósito.

Acciones de compilación adicionales

Visual Studio permite cambiar el nombre de tipo de elemento de un archivo en un proyecto con la propiedad Acción de compilación de la ventana Propiedades de archivo . Los nombres de tipo de elemento Compile, EmbeddedResource, Content y None siempre se muestran en este menú, junto con cualquier otro nombre de tipo de elemento que ya esté en el proyecto. Para asegurarse de que los nombres de tipo de elemento personalizados siempre están disponibles en este menú, puede agregar los nombres a un tipo de elemento denominado AvailableItemName. Por ejemplo, al agregar lo siguiente al archivo de proyecto, se agregará el tipo personalizado JScript a este menú para todos los proyectos que lo importen:

<ItemGroup>
    <AvailableItemName Include="JScript"/>
</ItemGroup>

Agregar nombres de tipo de elemento al AvailableItemName tipo de elemento hará que los elementos de ese tipo aparezcan en el Explorador de soluciones.

Nota:

Algunos nombres de tipo de elemento son especiales para Visual Studio, pero no se muestran en esta lista desplegable.

Compiladores en proceso

Cuando sea posible, Visual Studio intentará usar la versión en proceso del compilador de Visual Basic para aumentar el rendimiento. (No aplicable a C#). Para que esto funcione correctamente, se deben cumplir las condiciones siguientes:

  • En un destino del proyecto, debe haber una tarea denominada Vbc para proyectos de Visual Basic.

  • El UseHostCompilerIfAvailable parámetro de la tarea debe establecerse en true.

IntelliSense en tiempo de diseño

Para obtener compatibilidad con IntelliSense en Visual Studio antes de que una compilación haya generado un ensamblado de salida, se deben cumplir las condiciones siguientes:

  • Debe haber un destino denominado Compile.

  • Compile El destino o una de sus dependencias deben llamar a la tarea del compilador para el proyecto, como Csc o Vbc.

  • Compile El destino o una de sus dependencias deben hacer que el compilador reciba todos los parámetros necesarios para IntelliSense, especialmente todas las referencias.

  • Se deben cumplir las condiciones enumeradas en la sección Compiladores en proceso .

Crear soluciones

En Visual Studio, visual Studio controla el archivo de solución y el orden de compilación del proyecto. Al compilar una solución con msbuild.exe en la línea de comandos, MSBuild analiza el archivo de solución y ordena las compilaciones del proyecto. En ambos casos, los proyectos se compilan individualmente en orden de dependencia y las referencias de proyecto a proyecto no se recorren. Por el contrario, cuando se compilan proyectos individuales con msbuild.exe, se recorren las referencias de proyecto a proyecto.

Al compilar dentro de Visual Studio, la propiedad $(BuildingInsideVisualStudio) se establece en true. Esto se puede usar en los archivos .targets o del proyecto para hacer que la compilación se comporte de forma diferente.

Mostrar propiedades y elementos

Visual Studio reconoce determinados nombres y valores de propiedad. Por ejemplo, la siguiente propiedad de un proyecto hará que la aplicación windows aparezca en el cuadro Tipo de aplicación del Diseñador de proyectos.

<OutputType>WinExe</OutputType>

El valor de la propiedad se puede editar en el Diseñador de proyectos y guardarlo en el archivo del proyecto. Si esta propiedad recibe un valor no válido editando manualmente, Visual Studio mostrará una advertencia cuando se cargue el proyecto y reemplace el valor no válido por un valor predeterminado.

Visual Studio comprende los valores predeterminados de algunas propiedades. Estas propiedades no se conservarán en el archivo del proyecto a menos que tengan valores no predeterminados.

Las propiedades con nombres arbitrarios no se muestran en Visual Studio. Para modificar propiedades arbitrarias en Visual Studio, debe abrir el archivo de proyecto en el editor XML y editarlas manualmente. Para obtener más información, vea la sección Editar archivos de proyecto en Visual Studio más adelante en este tema.

Los elementos definidos en el proyecto con nombres arbitrarios de tipo de elemento se muestran de forma predeterminada en el Explorador de soluciones en su nodo de proyecto. Para ocultar un elemento de la vista, establezca el metadato Visible como false. Por ejemplo, el siguiente elemento participará en el proceso de compilación, pero no se mostrará en el Explorador de soluciones.

<ItemGroup>
    <IntermediateFile Include="cache.temp">
        <Visible>false</Visible>
    </IntermediateFile>
</ItemGroup>

Nota:

El Visible de soluciones omite los metadatos para proyectos de C++. Los elementos siempre se mostrarán incluso si Visible se establece en false.

Los elementos declarados en archivos importados en el proyecto no se muestran de forma predeterminada. Los elementos creados durante el proceso de compilación nunca se muestran en el Explorador de soluciones.

Condiciones de elementos y propiedades

Durante una compilación, se respetan plenamente todas las condiciones.

Al determinar los valores de propiedad que se van a mostrar, las propiedades que Visual Studio considera dependientes de la configuración se evalúan de forma diferente a las propiedades que considera independientes de la configuración. En el caso de las propiedades que considera dependientes de la configuración, Visual Studio establece las Configuration propiedades y Platform de forma adecuada e indica a MSBuild que vuelva a evaluar el proyecto. En el caso de las propiedades que considera independientes de la configuración, es indeterminado cómo se evaluarán las condiciones.

Las expresiones condicionales de los elementos siempre se omiten para decidir si el elemento debe mostrarse en el Explorador de soluciones.

Depuración

Para buscar e iniciar el ensamblado de salida y adjuntar el depurador, Visual Studio necesita las propiedades OutputPath, AssemblyNamey OutputType correctamente definidas. El depurador no se adjuntará si el proceso de compilación no provocó que el compilador generara un archivo .pdb.

Ejecución del objetivo en tiempo de diseño

Visual Studio intenta ejecutar destinos con determinados nombres cuando carga un proyecto. Estos destinos incluyen Compile, ResolveAssemblyReferences, ResolveCOMReferences, GetFrameworkPathsy CopyRunEnvironmentFiles. Visual Studio ejecuta estos destinos para que el compilador se pueda inicializar para proporcionar IntelliSense, se puede inicializar el depurador y se pueden resolver las referencias que se muestran en el Explorador de soluciones. Si estos objetivos no están presentes, el proyecto se cargará y se compilará correctamente, pero la experiencia de diseño en Visual Studio puede no ser completamente funcional.

Edición de archivos de proyecto en Visual Studio

Para editar un proyecto de MSBuild directamente, puede abrir el archivo de proyecto en el editor XML de Visual Studio.

Para descargar y editar un archivo de proyecto en Visual Studio

  1. En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto y elija Descargar proyecto.

    El proyecto está marcado (no disponible).

  2. En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto no disponible y elija Editar <archivo> de proyecto.

    El archivo del proyecto se abre en el Editor XML de Visual Studio.

  3. Edite, guarde y cierre el archivo del proyecto.

  4. En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto no disponible y elija Volver a cargar proyecto.

IntelliSense y validación

Cuando se usa el editor XML para editar archivos de proyecto, IntelliSense y la validación se controlan mediante los archivos de esquema de MSBuild. Se instalan en la caché de esquemas, que se puede encontrar en <el directorio> de instalación de Visual Studio\Xml\Schemas\1033\MSBuild.

Los tipos principales de MSBuild se definen en Microsoft.Build.Core.xsd y los tipos comunes usados por Visual Studio se definen en Microsoft.Build.CommonTypes.xsd. Para personalizar los esquemas para que disponga de IntelliSense y validación de nombres de tipos de elementos personalizados, propiedades y tareas, puede editar Microsoft.Build.xsd o crear su propio esquema que incluya los esquemas CommonTypes o Core. Si crea su propio esquema, tendrá que dirigir el editor XML para encontrarlo mediante la ventana Propiedades .

Edición de archivos de proyecto cargados

Visual Studio almacena en caché el contenido de los archivos de proyecto y los archivos importados por los archivos del proyecto. Si edita un archivo de proyecto cargado, Visual Studio le pedirá automáticamente que vuelva a cargar el proyecto para que los cambios surtan efecto. Sin embargo, si edita un archivo importado por un proyecto cargado, no habrá ningún mensaje de recarga y debe descargar y volver a cargar el proyecto manualmente para que los cambios surtan efecto.

Grupos de salida

Varios destinos definidos en Microsoft.Common.targets tienen nombres que terminan en OutputGroups o OutputGroupDependencies. Visual Studio llama a estos targets para obtener listas específicas de outputs del proyecto. Por ejemplo, el SatelliteDllsProjectOutputGroup destino crea una lista de todos los ensamblados satélite que creará una compilación. Estos grupos de salida se usan por características como la publicación, la implementación y las referencias de proyecto a proyecto. Los proyectos que no los definen se cargarán y compilarán en Visual Studio, pero es posible que algunas características no funcionen correctamente.

Resolución de referencia

La resolución de referencia es el proceso de usar los elementos de referencia almacenados en un archivo de proyecto para buscar ensamblados reales. Visual Studio debe desencadenar la resolución de referencia para mostrar propiedades detalladas para cada referencia en la ventana Propiedades . En la lista siguiente se describen los tres tipos de referencias y cómo se resuelven.

  • Referencias de ensamblado:

    El sistema de proyecto llama a un objetivo con el nombre conocido ResolveAssemblyReferences. Este destino debe generar elementos del tipo de elemento con el nombre ReferencePath. Cada uno de estos elementos debe tener una especificación de elemento (el valor del Include atributo de un elemento) que contiene la ruta de acceso completa a la referencia. Los elementos deben tener todos los metadatos de los elementos de entrada transferidos, además de estos nuevos metadatos:

    • CopyLocal, que indica si el ensamblado se debe copiar en la carpeta de salida, establecido en true o false.

    • OriginalItemSpec, que contiene la especificación del ítem original de la referencia.

    • ResolvedFrom, se establece en "{TargetFrameworkDirectory}" si se resolvió desde el directorio de .NET Framework.

  • Referencias COM:

    El sistema de proyecto llama a un objetivo con el nombre conocido ResolveCOMReferences. Este destino debe generar elementos del tipo de elemento con el nombre ComReferenceWrappers. Cada uno de estos elementos debe tener una especificación de elemento que contenga la ruta de acceso completa al ensamblado de interoperabilidad para la referencia COM. Los elementos deben tener todos los metadatos de los elementos de entrada pasados, además de los nuevos metadatos con el nombre CopyLocal, lo que indica si el ensamblado debe copiarse en la carpeta de salida, establecido en true o false.

  • Referencias nativas

    El sistema de proyecto llama a un destino conocido con el nombre ResolveNativeReferences. Este objetivo debe generar elementos con el nombre del tipo de elemento NativeReferenceFile. Los elementos deben tener todos los metadatos de los elementos de entrada pasados, además de un nuevo fragmento de metadatos denominado OriginalItemSpec, que contiene la especificación de elemento original de la referencia.

Métodos abreviados de rendimiento

Si usa el IDE de Visual Studio para iniciar la depuración (ya sea seleccionando la tecla F5 o seleccionando Depurar> en la barra de menús) o para compilar el proyecto (por ejemplo, Compilar>solución de compilación), el proceso de compilación usa una comprobación de actualización rápida para mejorar el rendimiento. En algunos casos en los que las compilaciones personalizadas crean archivos que se crean a su vez, la comprobación de actualización rápida no identifica correctamente los archivos modificados. Los proyectos que necesitan comprobaciones de actualización más exhaustivas pueden desactivar la comprobación rápida estableciendo la variable DISABLEFASTUPTODATECHECK=1de entorno . Como alternativa, los proyectos pueden establecerlo como una propiedad de MSBuild en el proyecto o en un archivo que el proyecto importa.