Configurar destinos y tareas
Las tareas de MSBuild seleccionadas se pueden establecer para ejecutarlas en el entorno de destino si el equipo de desarrollo admite el entorno de destino. Por ejemplo, si se utiliza un equipo Windows de 64 bits para compilar una aplicación destinada a una arquitectura de Windows de 32 bits, las tareas seleccionadas se ejecutan en un proceso de 32 bits.
Nota
Si una tarea de compilación se escribe en un lenguaje .NET, como Visual C# o Visual Basic, y no utiliza recursos o herramientas nativos, se ejecutará en cualquier contexto de destino sin adaptación.
Atributos UsingTask y parámetros de tareas
Los siguientes atributos de UsingTask
afectan a todas las operaciones de una tarea en un proceso de compilación determinado:
El atributo de
Runtime
, si está presente, establece la versión de Common Language Runtime (CLR), y puede tomar cualquiera de estos valores:CLR2
,CLR4
,CurrentRuntime
o*
(cualquier tiempo de ejecución).El atributo de
Architecture
, si está presente, establece la plataforma y el valor de bits, y puede tomar cualquiera de estos valores:x86
,x64
,CurrentArchitecture
o*
(cualquier arquitectura).El atributo de
TaskFactory
, si está presente, establece el generador de tareas que crea y ejecuta la instancia de tarea, y únicamente toma el valorTaskHostFactory
. Para obtener más información, vea Generadores de tareas más adelante en este documento.
<UsingTask TaskName="SimpleTask"
Runtime="CLR2"
Architecture="x86"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v3.5.dll" />
También puede utilizar los parámetros MSBuildRuntime
y MSBuildArchitecture
para establecer el contexto de destino de una invocación de tarea individual.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MyTarget">
<SimpleTask MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
</Target>
</Project>
Antes de que MSBuild ejecute una tarea, busca un valor UsingTask
coincidente que tenga el mismo contexto de destino. Los parámetros que se especifican en UsingTask
pero no en la tarea correspondiente se consideran coincidentes. Los parámetros que se especifican en la tarea pero no en el valor UsingTask
correspondiente también se consideran coincidentes. Si no se especifican valores de parámetros no se especifican en UsingTask
o la tarea, los valores se establecen de manera predeterminada en *
(cualquier parámetro).
Advertencia
Si existe más de un UsingTask
y todos tienen atributos TaskName
, Runtime
y Architecture
coincidentes, el primero que se evalúe reemplaza a los demás. Esto es diferente del comportamiento de los elementos Property
y Target
.
Si se definen parámetros en la tarea, MSBuild intenta encontrar un valor UsingTask
que coincida con estos parámetros o, al menos, que no esté en conflicto con ellos. Más de un UsingTask
puede especificar el contexto de destino de la misma tarea. Por ejemplo, una tarea que tiene archivos ejecutables diferentes para entornos de destino diferentes podría parecerse a esta:
<UsingTask TaskName="MyTool"
Runtime="CLR2"
Architecture="x86"
AssemblyFile="$(MyToolsPath)\MyTool.v2.0.dll" />
<UsingTask TaskName="MyTool"
Runtime="CLR4"
Architecture="x86"
AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MyTarget">
<MyTool MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
</Target>
</Project>
Invalidación del valor predeterminado de UsingTasks
De forma predeterminada, MSBuild controla el elemento UsingTask priorizándolo según el concepto "el primero en llegar, gana". A partir de la versión 17.2, MSBuild admite la invalidación de este comportamiento a través del parámetro Override
. Un elemento UsingTask con el parámetro Override
establecido en true
tendrá prioridad sobre cualquier otro con el mismo atributo TaskName.
<UsingTask TaskName="MyTool"
Runtime="CLR4"
Architecture="x86"
Override="true"
AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />
Advertencia
Esto solo se puede hacer una vez por tarea. Las compilaciones que intenten agregar varias invalidaciones para la misma tarea recibirán el error de MSBuild MSB4275
.
Generadores de tareas
Antes de ejecutar una tarea, MSBuild comprueba si está designada para ejecutarse en el contexto actual del software. De ser así, MSBuild la pasa a AssemblyTaskFactory
, que la ejecuta en el proceso actual; de lo contrario, MSBuild pasa la tarea a la TaskHostFactory
, que la ejecuta en un proceso que coincida con el contexto de destino. Incluso si el contexto actual y el contexto de destino coinciden, puede forzar que una tarea se ejecute fuera de proceso (por motivos de aislamiento, seguridad, o de otra índole) estableciendo TaskFactory
en TaskHostFactory
.
<UsingTask TaskName="MisbehavingTask"
TaskFactory="TaskHostFactory"
AssemblyFile="$(MSBuildToolsPath)\MyTasks.dll">
</UsingTask>
Cuando se especifica TaskHostFactory
explícitamente, el proceso que ejecuta la tarea es de corta duración. Esto permite que el sistema operativo limpie todos los recursos relacionados con la tarea inmediatamente después de que se ejecute. Por este motivo, especifique TaskHostFactory
al hacer referencia a las tareas integradas en el mismo proceso de compilación que su uso, para evitar errores de archivo en uso al actualizar el ensamblado de tareas después de una compilación.
Parámetros de tareas fantasma
Al igual que cualquier otro parámetro de tarea, MSBuildRuntime
y MSBuildArchitecture
se pueden establecer desde las propiedades de compilación.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FrameworkVersion>3.0</FrameworkVersion>
</PropertyGroup>
<Target Name="MyTarget">
<SimpleTask MSBuildRuntime="$(FrameworkVerion)" MSBuildArchitecture= "x86"/>
</Target>
</Project>
A diferencia de otros parámetros de tarea, MSBuildRuntime
y MSBuildArchitecture
no son evidentes para la propia tarea. Para escribir una tarea que tenga en cuenta el contexto en el que se ejecuta, debe probar el contexto mediante una llamada a .NET Framework o bien debe usar propiedades de compilación para pasar información de contexto a través de otros parámetros de tarea.
Nota
Es posible establecer atributos UsingTask
desde las propiedades del conjunto de herramientas y del entorno.
Los parámetros MSBuildRuntime
y MSBuildArchitecture
proporcionan la manera más flexible de establecer el contexto de destino, pero también la manera más limitada en cuanto al ámbito. Por un lado, dado que se establecen en la propia instancia de tarea y no se evalúan hasta que la tarea está a punto de ejecutarse, pueden derivar su valor del ámbito completo de propiedades disponibles en tiempo de evaluación y tiempo de compilación. Por otro lado, estos parámetros solo se aplican a una instancia determinada de una tarea en un destino determinado.
Nota
Los parámetros de tareas se evalúan en el contexto del nodo primario, no en el del host de tareas. Las variables de entorno dependientes del tiempo de ejecución o de la arquitectura (por ejemplo, la ubicación Archivos de programa) se evalúan como el valor que coincide con el nodo primario. Pero si la tarea lee directamente la misma variable de entorno, se evaluará correctamente en el contexto del host de la tarea.
Contenido relacionado
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de