我有一个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。而且我很乐意摆脱这个运行时反射魔法和未键入的object
和dynamic
而不是Project
- 由于这个原因,代码已经变得无法维护。
答案 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}。