static List <(string prefix, string subst)> GetPrefixes(IRuntimeInformation runtimeInfo) { var list = new List <(string prefix, string subst)> (); list.Add((runtimeInfo.GetBinPath(), "$(MSBuildBinPath)")); list.Add((runtimeInfo.GetToolsPath(), "$(MSBuildToolsPath)")); foreach (var extPath in runtimeInfo.GetExtensionsPaths()) { list.Add((extPath, "$(MSBuildExtensionsPath)")); } var sdksPath = runtimeInfo.GetSdksPath(); if (sdksPath != null) { list.Add((sdksPath, "$(MSBuildSDKsPath)")); } return(list); }
public static MSBuildEvaluationContext Create(IRuntimeInformation runtime, string projectPath, string thisFilePath) { // MSBuildEvaluationContext can only populate these properties from an MSBuildProject and we don't have one // OTOH this isn't a full evaluation anyway. Just set up a bunch of properties commonly used for imports. // TODO: add more commonly used properties var ctx = new MSBuildEvaluationContext(); string tvString = MSBuildToolsVersion.Unknown.ToVersionString(); string binPath = MSBuildProjectService.ToMSBuildPath(null, runtime.GetBinPath()); string toolsPath = MSBuildProjectService.ToMSBuildPath(null, runtime.GetToolsPath()); var extPaths = runtime.GetExtensionsPaths(); ctx.extensionPaths = new List <string> (extPaths); AddReadOnlyProp("MSBuildBinPath", binPath); AddReadOnlyProp("MSBuildToolsPath", toolsPath); AddReadOnlyProp("MSBuildToolsPath32", toolsPath); AddReadOnlyProp("MSBuildToolsPath64", toolsPath); AddReadOnlyProp("RoslynTargetsPath", $"{binPath}\\Roslyn"); AddReadOnlyProp("MSBuildToolsVersion", tvString); var extPath = MSBuildProjectService.ToMSBuildPath(null, extPaths.First()); AddReadOnlyProp("MSBuildExtensionsPath", extPath); AddReadOnlyProp("MSBuildExtensionsPath32", extPath); AddReadOnlyProp("VisualStudioVersion", "15.0"); var defaultSdksPath = runtime.GetSdksPath(); if (defaultSdksPath != null) { AddReadOnlyProp("MSBuildSDKsPath", MSBuildProjectService.ToMSBuildPath(null, defaultSdksPath)); } // project path properties string escapedProjectDir = MSBuildProjectService.ToMSBuildPath(null, Path.GetDirectoryName(projectPath)); AddReadOnlyProp("MSBuildProjectDirectory", escapedProjectDir); // "MSBuildProjectDirectoryNoRoot" is this actually used for anything? AddReadOnlyProp("MSBuildProjectExtension", MSBuildProjectService.EscapeString(Path.GetExtension(projectPath))); AddReadOnlyProp("MSBuildProjectFile", MSBuildProjectService.EscapeString(Path.GetFileName(projectPath))); AddReadOnlyProp("MSBuildProjectFullPath", MSBuildProjectService.ToMSBuildPath(null, Path.GetFullPath(projectPath))); AddReadOnlyProp("MSBuildProjectName", MSBuildProjectService.EscapeString(Path.GetFileNameWithoutExtension(projectPath))); //don't have a better value, this is as good as anything AddReadOnlyProp("MSBuildStartupDirectory", escapedProjectDir); // this file path properties AddReadOnlyProp("MSBuildThisFile", MSBuildProjectService.EscapeString(Path.GetFileName(thisFilePath))); AddReadOnlyProp("MSBuildThisFileDirectory", MSBuildProjectService.ToMSBuildPath(null, Path.GetDirectoryName(thisFilePath)) + "\\"); //"MSBuildThisFileDirectoryNoRoot" is this actually used for anything? AddReadOnlyProp("MSBuildThisFileExtension", MSBuildProjectService.EscapeString(Path.GetExtension(thisFilePath))); AddReadOnlyProp("MSBuildThisFileFullPath", MSBuildProjectService.ToMSBuildPath(null, Path.GetFullPath(thisFilePath))); AddReadOnlyProp("MSBuildThisFileName", MSBuildProjectService.EscapeString(Path.GetFileNameWithoutExtension(thisFilePath))); //HACK: we don't get a usable value for this without real evaluation so hardcode 'obj' var projectExtensionsPath = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(projectPath), "obj")); AddReadOnlyProp("MSBuildProjectExtensionsPath", MSBuildProjectService.ToMSBuildPath(null, projectExtensionsPath) + "\\"); return(ctx); void AddReadOnlyProp(string key, string val) { ctx.SetPropertyValue(key, val); readonlyProps.Add(key); } }