6

我有一个Project实例,但我不明白如何找出项目类型/语言。具体来说,我需要检查一个 C/C++ 项目。

文档似乎缺乏。

以前,另一个人在我的开源 VS 扩展中添加了以下魔法,它在 VS2013-2015 中有效:

private static bool isVisualCppProject(object project)
{
    Type projectObjectType = project.GetType();
    var projectInterface = projectObjectType.GetInterface("Microsoft.VisualStudio.VCProjectEngine.VCProject");
    return projectInterface != null;
}

   ...

isVisualCppProject(project.Object);

但它不再适用于 VS 2017 RC。我很乐意摆脱这种运行时反射魔法和无类型objectdynamic而不是Project- 代码已经因此变得无法维护。

4

2 回答 2

2

如上面的评论所述,EnvDTE.Project.Kind 是第一个要查看的地方。请参阅HOWTO:从加载项或宏中猜测 Visual Studio 项目的类型

有一些知名 GUID 的列表,请参阅INFO: List of known project type Guids

您可能对 {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} 感兴趣。但是一个项目可能有不同的子类型,在这种情况下会应用多个 GUID。例如 MVC + C#。请参阅HOWTO:从加载项获取 Visual Studio 项目的项目风格(子类型)

EnvDTE.Project.Kind 包含主要项目类型,不能保证例如 C++ GUID 将存储在此属性中。最安全的方法是检索应用于项目的所有 GUID。使用最后一个链接中的GetProjectTypeGuids方法。您将获得所有 GUID 的列表,然后您只需测试它是否包含 {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}。

于 2016-12-19T07:31:27.400 回答
2

您可以通过项目扩展名确定项目类型,以下演示供您参考。

    DTE2 dte = (DTE2)this.ServiceProvider.GetService(typeof(DTE));
            Solution2 solution = (Solution2)dte.Solution;

            foreach (Project p in solution.Projects)
            {

                string[] projectName = p.FullName.Split('.');

                if (projectName.Length > 1)
                {
                   string fileExt = projectName[projectName.Length-1];

                    if (fileExt == "vcxproj")
                    {
                        //is c/c++ porject
                    }
                }
}
于 2016-12-19T07:00:52.040 回答