2009-08-13 11 views
6

Sto scrivendo un compito MSBuild che aggiunge un po 'di generazione di codice per un progetto standard C# (.csproj). L'attività deve accedere ai tipi negli assiemi a cui fa riferimento tale progetto.MSBuild ottenere riferimento assembly da ProjectReference

Questo è semplice per i riferimenti di assemblaggio (ottenere tutti gli elementi in <Riferimento>), ma diventa più difficile per i riferimenti ad altri progetti (<ProjectReference>)

Ha MSBuild fornisce un modo per recuperare un riferimento assembly compilato da a <ProjectReference>?

In caso contrario, c'è un modo semplice per risolvere quel nome leggendo il file Csproj?

Il file Csproj non fornisce direttamente il percorso assembly compilato, deve essere ricostruita da altre proprietà. Inoltre, alcune delle proprietà sono condizionali (a seconda della configurazione di Debug/Release), quindi l'utilizzo di un lettore XPath semplice non funzionerebbe:

Nome file Dll può essere ottenuto da <AssemblyName>, ma il percorso in cui il file Dll è scritto è in

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

c'è un modo per leggere il file di programmazione .csproj e risolvere il valore corretto di OutputPath valutando tutte le condizioni?

ho bisogno di una soluzione in cui i file di riferimento Csproj rimangono file di progetto vecchi semplici (nessuna modifica ai file csproj che dovrebbe aggiungere le informazioni necessarie in modo più accessibile)

risposta

6

si poteva mettere qualcosa di simile:

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

al tuo progetto e chiamare in questo modo:

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

Aggiungere il condimento a piacere.

Questo comporta MSBuilding le dipendenze di elaborare le uscite (informazioni sopraelevazione staticamente essere derivata dovuto al modo in cui le inclusioni sono trattati in MSBuild - per esempio, dove sarebbe TeamBuild mettere le uscite?).

Il libro Inside the MSBuild Engine è ottimo per scavare in questo genere di assurdità.

Problemi correlati