msbuild msbuild-task

MSBuild UsingTask Resolve References



msbuild-task (2)

Siento que ya arreglé esto antes, pero no recuerdo cómo.

Tengo un archivo de tareas que se ve así (CustomTasks.tasks):

<UsingTask AssemblyFile="CustomTasks.dll" TaskName="MyCustomTask"/>

hace referencia a un ensamblado (a saber, Ionic.Zip.dll). Ionic.Zip.dll no está en el GAC (y no quiero que sea). Se encuentra justo al lado de mi CustomTasks.dll.

Tengo un directorio llamado MSBuild un nivel arriba desde mi archivo sln que tiene CustomTasks.tasks, CustomTasks.dll y Ionic.Zip.dll en él.

Tengo un csproj que hace referencia al archivo de tareas y llama a la tarea personalizada:

<Import Project="$(ProjectDir)/../MSBuild/CustomTasks.tasks" /> <MyCustomTask ..... />

en tiempo de compilación, esto produce:

La tarea "MyCustomTask" no se pudo cargar desde el ensamblado ... MyCustomTasks.dll. No se pudo cargar el archivo o ensamblado ''Ionic.Zip, ......'' o una de sus dependencias.


Me sentí cansado y frustrado y tomé un enfoque directo ... No creo que sea de la misma manera en que resolví el problema anteriormente ... pero quizás esto ayude a alguien más. Otras soluciones más elegantes son más que bienvenidas.

<Target Name="BeforeBeforeBuild" BeforeTargets="BeforeBuild"> <HandleAssemblyResolve SearchPath="$(ProjectDir)/../MSBuild/" /> </Target> <UsingTask TaskName="HandleAssemblyResolve" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)/Microsoft.Build.Tasks.v4.0.dll"> <ParameterGroup> <SearchPath ParameterType="System.String" Required="true" /> </ParameterGroup> <Task> <Using Namespace="System" /> <Using Namespace="System.IO" /> <Using Namespace="System.Reflection" /> <Code Type="Fragment" Language="cs"> <![CDATA[ AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => { var assemblySearchPath = Path.Combine(SearchPath, e.Name.Split('','')[0]); if (File.Exists(assemblySearchPath)) return Assembly.LoadFrom(assemblySearchPath); return null; }; ]]> </Code> </Task> </UsingTask>


Esto es realmente fácil de arreglar. Coloque sus tareas y dependencias personalizadas de compilación en una carpeta diferente. Entonces las dependencias se cargan correctamente.

Por ejemplo, así:

<UsingTask AssemblyFile="../BuildTools/CustomTasks.dll" TaskName="MyCustomTask"/>