Используйте зарезервированное свойство $(MSBuildToolsPath)
, которое разрешается примерно так, в зависимости от версии .NET:
C:\Windows\Microsoft.NET\Frameworks\v4.0.30319\
Существует также семейство свойств $ (MSBuildExtensionsPath) (включая 32- и 64-разрядные), которые будут указывать на:
C:\Program Files\MSBuild\
- из книги "MSBuild Trickery" трюки № 19 и № 43
edit: добавление кода макроса для извлечения
Следующий макрос Visual Studio будет перечислять все текущие свойства, включая $ (MSBuildToolsPath), $ (MSBuildToolsRoot) и $ (MSBuildToolsPath32), последнее из которых возможно только на 64-битной машине, я не уверен.
'
' Note: you need to have an open solution, an active document,
' and a visible Build pane in the Output window
'
Public Module Module1
Public Sub ListProperties()
Dim doc As Document = DTE.ActiveDocument
Dim projectItem As ProjectItem = doc.ProjectItem
Dim project As Project = projectItem.ContainingProject
Dim evalProject As Microsoft.Build.Evaluation.Project = _
Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection _
.LoadProject(project.FullName)
Dim ow As EnvDTE.OutputWindow
ow = DTE.ToolWindows.OutputWindow
Dim wp As OutputWindowPane
wp = ow.OutputWindowPanes.Item("Build")
Dim e As System.Collections.Generic.IEnumerator(Of Microsoft.Build _
.Evaluation.ProjectProperty)
e = evalProject.AllEvaluatedProperties.GetEnumerator()
e.MoveNext()
For i = 0 To evalProject.AllEvaluatedProperties.Count - 1
Dim s As String
s = s + e.Current.Name + " = " + e.Current.UnevaluatedValue + vbCrLf
wp.OutputString(s)
e.MoveNext()
s = ""
Next
End Sub
End Module