【问题标题】:list available platform toolsets列出可用的平台工具集
【发布时间】:2013-01-05 01:04:52
【问题描述】:

有没有办法列出 VS2012 中可用的平台工具集?我的意思是一个可能包含 v90、v100、v110、v110_xp 和任何外部提供的平台工具集的列表。或者(应该更容易):有没有办法检查给定的平台工具集是否已安装?

【问题讨论】:

  • 我有一个 C# 程序可以做到这一点,因为它依赖于 .NET 程序的 MsBuild。这是一个可以接受的答案吗?
  • 这个问题早就忘记了......我认为值得发布任何提示作为答案,即使它不是我(或 Sneftel)可能想要使用的语言。
  • 就个人而言,我宁愿只知道要查看磁盘上的哪个位置,但在不调用 MSBuild 的情况下这样做可能是一个近似过程。

标签: visual-c++ visual-studio-2012 msvcrt


【解决方案1】:

这是一个控制台应用程序实用程序(在 C# 中),它转储工具集列表(针对每个可用配置)。您需要添加对Microsoft.Build 的引用才能编译。请注意,正确的工具集列表应该取决于要构建的项目:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace ListToolsets
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Format is ListToolsets <project file path>");
                return;
            }

            foreach (var toolset in PlatformToolset.GetPlatformToolsets(args[0]))
            {
                Console.WriteLine(toolset.Platform);
                foreach (string ts in toolset.Toolsets)
                {
                    Console.WriteLine(" " + ts);
                }
            }
        }

    }

    public class PlatformToolset
    {
        private PlatformToolset()
        {
            Toolsets = new List<string>();
        }

        public string Platform { get; private set; }
        public IList<string> Toolsets { get; private set; }

        public static IList<PlatformToolset> GetPlatformToolsets(string projectPath)
        {
            var list = new List<PlatformToolset>();
            var project = new Microsoft.Build.Evaluation.Project(projectPath);
            AddPlatformToolsets(project, @"$(VCTargetsPath14)\Platforms", list);
            AddPlatformToolsets(project, @"$(VCTargetsPath12)\Platforms", list);
            AddPlatformToolsets(project, @"$(VCTargetsPath11)\Platforms", list);
            AddPlatformToolsets(project, @"$(VCTargetsPath10)\Platforms", list);
            return list;
        }

        private static void AddPlatformToolsets(Microsoft.Build.Evaluation.Project project, string path, IList<PlatformToolset> list)
        {
            string platforms = Path.GetFullPath(project.ExpandString(path));
            if (!Directory.Exists(platforms))
                return;

            foreach (string platformPath in Directory.GetDirectories(platforms))
            {
                string platform = Path.GetFileName(platformPath);
                PlatformToolset ts = list.FirstOrDefault(t => t.Platform == platform);
                if (ts == null)
                {
                    ts = new PlatformToolset();
                    ts.Platform = platform;
                    list.Add(ts);
                }

                foreach (string toolset in Directory.GetDirectories(Path.Combine(platformPath, "PlatformToolsets")))
                {
                    string name = Path.GetFileName(toolset);
                    string friendlyName = project.GetPropertyValue("_PlatformToolsetFriendlyNameFor_" + name);
                    ts.Toolsets.Add(string.IsNullOrWhiteSpace(friendlyName) ? name : friendlyName);
                }
            }
        }
    }
}

【讨论】:

  • 似乎是一个不错的方向。但是,这些 VCTargetsPathXX 似乎有些神奇......顺便说一句,添加 VCTargetsPath12 是检测 v120(_xp) 工具集所必需的。我的主要问题是:这会检测第三方工具集还是仅检测与 VS 一起提供的工具集。
  • 这里没有魔法。 VCTargetsPathsXX 在 msbuild 目标文件(.targets 或其他扩展名)中定义,您可以在“...ProgramFiles\MsBuild\...”中找到这些文件。可以用本地VS安装路径替换。这会检测位于这些目录中的所有工具集。
  • 是的,但是如何获取所有适用的 VCTargetsPathXX 变量的列表?例如在 VS2014 中,我需要添加 VCTargetsPath13,或者不管他们如何称呼它。
  • 您在问题中询问了 VS2012。
  • @Bishop - 我不知道任何 VS2014 - 很抱歉很挑剔 :) 我已经更新了支持 VS2013 的答案
猜你喜欢
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 2020-08-14
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
相关资源
最近更新 更多