Wann legt MSBuild die Eigenschaft $ (ProjectName) fest?

MSBuild ist noch relativ neu und ich habe einige Anpassungen an einer Wpf-Projektdatei vorgenommen, die ich sowohl in VS2010 als auch in TFS2010 erstelle. Ich habe den Ausgabepfad wie folgt angepasst:

<OutputPath Condition=" '$(TeamBuildOutDir)' == '' ">$(SolutionDir)build\binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath>
<OutputPath Condition=" '$(TeamBuildOutDir)' != '' ">$(TeamBuildOutDir)binaries\$(ProjectName)\$(Configuration)\$(Platform)</OutputPath>

Auf diese Weise kann ich beim Erstellen auf dem Desktop ein zentrales Verzeichnis für Binärdateien erstellen und TFS kann die Binärdateien finden, wenn CI-Builds ausgeführt werden.

In beiden Fällen wird die Eigenschaft "$ (ProjectDir)" zur Erstellungszeit als "" ausgewertet, was zu seltsamen Ergebnissen führt. Beim Debuggen sieht es so aus, als wäre $ (ProjectName) zum Zeitpunkt der Ausführung von BeforeBuild festgelegt, aber meine OutputPath-Eigenschaft wertet es vor diesem Zeitpunkt aus.

<ProjectNameUsedTooEarly Condition=" '$(ProjectName)' == '' ">true</ProjectNameUsedTooEarly>

Die vorhergehende Eigenschaft befindet sich in derselben Eigenschaftsgruppe wie meine OutputPath-Eigenschaft. Im BeforeBuild-Ziel wird $ (ProjectNameUsedTooEarly) als true ausgewertet, aber $ (ProjectName) wird zu diesem Zeitpunkt als normaler Projektname ausgewertet.

Was kann ich tun, um sicherzustellen, dass $ (ProjectName) einen Wert hat, wenn ich ihn verwende?

edit: Ich habe gerade Attrices MSBuild Sidekick zum Debuggen meiner Build-Datei verwendet und in dem allerersten für Haltepunkte verfügbaren Ziel (_CheckForInvalidConfigurationAndPlatform) scheinen alle Eigenschaften bereits festgelegt zu sein. ProjectName ist bereits korrekt festgelegt, aber meine OutputPath-Eigenschaft wurde bereits mit dem leeren Wert von ProjectName festgelegt.