2009-08-13 12 views
6

Ich schreibe eine MSBuild-Task, die einige Code-Generierung zu einem Standard-C# -Projekt (.csproj) hinzufügt. Die Task muss auf Typen in Assemblys zugreifen, auf die von diesem Projekt verwiesen wird.MSBuild erhalten Assembly-Referenz von ProjectReference

ist diese einfache Montagereferenzen (alle Elemente in <Referenz> bekommen), aber es wird noch schwieriger für Verweise auf andere Projekte (<ProjectReference>)

Bietet MSBuild eine Möglichkeit, eine kompilierte Assembly Referenz aus abrufen a <ProjectReference>?

Wenn nicht, gibt es eine einfache Möglichkeit, diesen Namen durch Lesen der .csproj-Datei aufzulösen?

Die Datei .csproj stellt den kompilierten Assembly-Pfad nicht direkt bereit, sondern muss aus anderen Eigenschaften rekonstruiert werden. Außerdem sind einige der Eigenschaften bedingt (abhängig von der Debug/Release-Konfiguration), so dass die Verwendung eines einfachen XPath-Readers nicht funktioniert:

Dll-Dateiname kann von <AssemblyName> erhalten werden, aber der Pfad, wo die Dll-Datei geschrieben wird, ist in

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

gibt es eine Möglichkeit programmatisch die CSPROJ-Datei zu lesen und den richtigen Wert von OutputPath durch alle Bedingungen Auswertung zu lösen?

Ich brauche eine Lösung, bei der die referenzierten CSPROJ Dateien nur alte Projektdateien (keine Änderungen an den csproj Dateien, die die notwendigen Informationen in einer zugänglicheren Weise hinzufügen würde) bleiben

Antwort

6

Sie etwas setzen könnte wie:

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

in Ihrem Projekt und es so nennen:

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

Würze nach Geschmack hinzufügen.

Dies beinhaltet MSBuilding der Abhängigkeiten, um die Ausgaben zu erarbeiten (die Info kann statisch aufgrund der Art und Weise abgeleitet werden, in der Inklusionen in MSBuild verarbeitet werden - z. B. wo würde TeamBuild die Ausgaben setzen?).

Das Innere der MSBuild Engine Buch ist ideal für diese Art von Unsinn zu graben.

Verwandte Themen