2009-08-13 10 views
6

Estoy escribiendo una tarea de MSBuild que añade algo de generación de código a un proyecto estándar C# (.csproj). La tarea necesita tener acceso a los tipos de ensamblados de referencia por ese proyecto.MSBuild llegar referencia de ensamblado de ProjectReference

Esto es simple para referencias de ensamblado (obtener todos los artículos en <Referencia>), pero se hace más difícil para las referencias a otros proyectos (<ProjectReference>)

¿Tiene MSBuild proporciona una manera de recuperar una referencia de ensamblado compilado a partir de un ProjectReference < >?

Si no, ¿hay una forma sencilla de resolver ese nombre leyendo el archivo .csproj?

El archivo .csproj no proporciona directamente la ruta del ensamblado compilado, tiene que ser reconstruido a partir de otras propiedades. Además, algunas de las propiedades son condicionales (dependiendo de la configuración de depuración/versión), por lo que usar un lector de XPath simple no funcionaría:

El nombre del archivo Dll se puede obtener de <AssemblyName>, pero la ruta donde se encuentra el archivo Dll que está escrito es en

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <OutputPath>;bin\Release</OutputPath> 
<PropertyGroup> 

¿hay una manera de leer el archivo mediante programación .csproj y resolver el valor correcto de OutputPath mediante la evaluación de todas las condiciones?

Necesito una solución en la que los archivos referenciados .csproj siguen siendo viejos archivos de proyecto simple (no modificaciones a los archivos csproj que agregarían la información necesaria de una manera más accesible)

Respuesta

6

se puede poner algo como:

<Target Name="CopyDllsFromDependentProjects"> 
<MSBuild Projects="@(ProjectReference)" Targets="Build" BuildInParallel="true" Condition="'%(Name)'=='ProjectA' Or '%(Name)'=='ProjectB'"> 
    <Output TaskParameter="TargetOutputs" ItemName="OutputAssemblies" /> 
</MSBuild> 
<Copy SourceFiles="@(OutputAssemblies)" DestinationFolder="$(PostBuildDir)" SkipUnchangedFiles="true" /> 

en su proyecto y lo llaman así:

<Target Name="AfterCompile" DependsOnTargets="CopyDllsFromDependentProjects" /> 

Agregar sazonar al gusto.

Esto implica MSBuilding las dependencias para calcular los resultados (la información no se puede derivar estáticamente debido a la forma en que se procesan las inclusiones en MSBuild, por ejemplo, ¿dónde pondría TeamBuild las salidas?).

El libro Inside the MSBuild Engine es ideal para profundizar en este tipo de tonterías.

Cuestiones relacionadas