6/10/2010 18:29
El Bruno
[MSBUILD] Utilizando ensamblados con dependencias en tiempo de ejecución en Custom Tasks en MSBuild

Buenas,
cuando creas una Custom Task para MSBuild, es probable que en algún momento te tientes de utilizar otros ensamblados dentro de la misma. Esto que se soluciona de una forma simple en aplicaciones .Net, en MSBuild puede ser un tanto complicado ya que el control que tenemos sobre el host de ejecución (MSBuild) no es bastante pobre.
Supongamos el siguiente escenario, donde una tarea llamada TaskFour utiliza un componente para realizar una suma (líneas 13 y 14):
1: using Microsoft.Build.Utilities;
2: using Microsoft.Build.Framework;
3: namespace ElBruno.MsBuild
4: {
5: public class TaskFour : Task
6: {
7: [Output]
8: public int AddResult { get; set; }
9: public int FirstArgument { get; set; }
10: public int SecondArgument { get; set; }
11: public override bool Execute()
12: {
13: var m = new MsBuildSample.Math();
14: AddResult = m.Add(FirstArgument, SecondArgument);
15: return true;
16: }
17: }
18: }
Si luego incluimos esta tarea en un proyecto de MSBuild (línes 3 y 4), e invocamos a la misma (líneas 6 y 8)
1: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
2: InitialTargets="Target1">
3: <UsingTask TaskName="ElBruno.MsBuild.TaskFour"
4: AssemblyFile="c:\srcBruno\Agile01\MsBuild Tests\Sample 04\bin\Debug\ElBruno.MsBuild.dll" />
5: <Target Name="Target1">
6: <TaskFour FirstArgument="2" SecondArgument="2">
7: <Output TaskParameter="AddResult" PropertyName="AddResult" />
8: </TaskFour>
9: <Message Text="Resultado: $(AddResult)"></Message>
10: </Target>
11: </Project>
podemos encontrarnos con el siguiente error en tiempo de ejecución:

donde básicamente podemos ver que la CustomTask FourTask no encuentra el ensamblado MsBuildSample.
En este caso, en el directorio que se utiliza para importar la tarea (líneas 3 y 4), vemos que no está el ensamblado MsBuildSample.

Si copiamos el ensamblado en la misma ruta

y ejecutamos el proyecto, el mismo ya ejecuta correctamente.

Pues bien, en este caso la recomendación es intentar tener en un único directorio todos los ensamblados de las Custom Tasks y de las dependencias de los mismos para los proyectos de MSBuild. En TFS esto cambia un poco … pero esto es para otro post.
Saludos @ Here
El Bruno

Archivado en: Visual Studio 2010,Build,Code Sample,MSBuild
Comparte este post: