如何确定EnvDTE.Project对象是否代表C / C ++项目?

时间:2016-12-16 08:44:25

标签: c# visual-studio visual-studio-extensions visual-studio-package

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

docs似乎缺乏。

之前,另一个人在我的开源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 - 由于这个原因,代码已经变得无法维护。

2 个答案:

答案 0 :(得分: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
                    }
                }
}

答案 1 :(得分:1)

如上面的评论所述,EnvDTE.Project.Kind是第一个看的地方。见HOWTO: Guess the type of a Visual Studio project from an add-in or macro

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

您可能对{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}感兴趣。但是项目可能有各种子类型,在这种情况下会应用多个GUID。例如MVC + C#。见HOWTO: Get the project flavor (subtype) of a Visual Studio project from an add-in

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