6

我有一個Project實例,我不明白如何找出項目類型/語言。具體來說,我需要檢查一個C/C++項目。如何確定EnvDTE.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 - 由於這個原因,代碼已經變得不可維護。

+0

'envdte.project'有'Kind'屬性(https://msdn.microsoft.com/en-us/library/envdte.project.kind.aspx)。這是GUID。在'PrjKind'中有預定義的項目種類(https://msdn.microsoft.com/en-us/library/vslangproj.prjkind.aspx),但似乎沒有c/C++的屬性。我想你可以得到這個GUID,它對於所有的c/C++項目都是一樣的。 –

+0

@AramKocharyan:我確實看到了'Kind',但沒有列出可能的「種類」,也沒有保證它在各種機器,裝置和VS版本中確實是靜態的...... –

+0

@ Violet-Giraffe:你解決了問題?如果問題仍然存在,請隨時通知我。 –

回答

1

您可以通過項目擴展名來確定項目類型,以及以下演示供您參考。

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

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

相關問題