2009-08-13 6 views
6

J'écris une tâche MSBuild qui ajoute de la génération de code à un projet C# standard (.csproj). La tâche doit accéder aux types dans les assemblys référencés par ce projet.MSBuild obtenir la référence d'assembly à partir de ProjectReference

est simple pour les références de montage (obtenir tous les articles dans < Référence >), mais il devient plus difficile pour les références à d'autres projets (<ProjectReference>)

Est-ce que MSBuild fournir un moyen de récupérer une référence d'assemblage compilé à partir un <ProjectReference>?

Sinon, existe-t-il un moyen simple de résoudre ce nom en lisant le fichier .csproj?

Le fichier .csproj ne fournit pas directement le chemin d'assemblage compilé, il doit être reconstruit à partir d'autres propriétés. En outre, certaines propriétés sont conditionnelles (en fonction de la configuration Debug/Release), donc l'utilisation d'un simple lecteur XPath ne fonctionnerait pas:

Le nom de fichier Dll peut être obtenu à partir de <AssemblyName>, mais le chemin d'accès au fichier Dll est écrit est en

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

est-il possible de lire le fichier programme .csproj et résoudre la valeur correcte de OutputPath en évaluant toutes les conditions?

je besoin d'une solution où les fichiers référencés .csproj restent simples anciens fichiers de projet (aucune modification aux fichiers csproj qui ajouteraient les informations nécessaires d'une manière plus accessible)

Répondre

6

Vous pouvez mettre quelque chose comme:

<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" /> 

à votre projet et l'appeler comme ceci:

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

Ajouter l'assaisonnement au goût. Ceci implique MSBuilding les dépendances pour élaborer les sorties (l'information peut être obtenue statiquement en raison de la façon dont les inclusions sont traitées dans MSBuild - par exemple, où TeamBuild place les sorties?).

Le livre Inside the MSBuild Engine est idéal pour creuser ce genre de non-sens.

Questions connexes