¿Cómo accedo al contexto actual del proyecto dentro de una tarea personalizada?

¿Cómo accedo al contexto actual del proyecto dentro de una tarea personalizada en MSBuild? Al principio parecía que la referencia GlobalProjectCollection en ProjectCollection permitiría el acceso, pero esto parece estar vacío, al menos cuando se ejecuta MSBuild desde la línea de comandos.

Actualmente puedo obtener una nueva instancia de Proyecto basada en el archivo de proyecto actual de la siguiente manera:

List projectAssemblies = new List(); using (XmlReader projectFileReader = XmlReader.Create(this.BuildEngine.ProjectFileOfTaskNode)) { Project project = new Project(projectFileReader); foreach (ProjectItem item in project.AllEvaluatedItems) { ... woo hoo ... } } 

Pero parece un montón de problemas. ¿Cómo puedo obtener acceso al proyecto desde el que se invoca mi tarea?

No se puede. MSBuild fue diseñado específicamente para que las tareas individuales solo tengan acceso a los parámetros que usted pasó explícitamente a la tarea, y nada más. Eso hace que los archivos de MSBuild sean más fáciles de leer, ahora que sabe que cada tarea solo se ve afectada por lo que especificó cuando llamó a esta tarea.

El código que tiene no está creando una copia del proyecto, está creando una nueva instancia, por lo que no debe esperar que las propiedades sean iguales. Por ejemplo, una instancia del proyecto que se está ejecutando actualmente (desde donde se llama a su tarea) podría tener propiedades anuladas desde la línea de comandos o modificadas en la forma en que se construyó su proyecto, mientras que su proyecto recién creado tendría un valor predeterminado de las propiedades después de la primera El motor de MSBuild pasa por el archivo.