【问题标题】:How to determine whether or not EnvDTE.Project object represents a C/C++ project?如何确定 EnvDTE.Project 对象是否代表 C/C++ 项目?
【发布时间】:2016-12-16 08:44:25
【问题描述】:

我有一个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 - 因此代码已经变得无法维护。

【问题讨论】:

  • envdte.projectKind 属性(msdn.microsoft.com/en-us/library/envdte.project.kind.aspx)。它是 GUID。 PrjKind (msdn.microsoft.com/en-us/library/vslangproj.prjkind.aspx) 中有预定义的项目种类,但似乎没有 c/c++ 的属性。我猜你可以得到那个 GUID,它对于所有 c/c++ 项目都是一样的。
  • @AramKocharyan:我确实看到了Kind,但没有可能的“种类”列表,也没有任何保证它在各种机器、安装和 VS 版本中确实是静态的......
  • @Violet-Giraffe:你解决了这个问题吗?如果问题仍然存在,请随时告诉我。
  • @ColeWu-MSFT:我相信你的回答会起作用,但我想在接受答案之前实际实施它。这需要对我的扩展进行相当仔细的重构。

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


【解决方案1】:

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

    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
                    }
                }
}

【讨论】:

    【解决方案2】:

    EnvDTE.Project.Kind 是第一个查看的地方,如上面的 cmets 中所述。见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}。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 2012-08-25
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多