簡體   English   中英

如何確定EnvDTE.Project對象是否代表C / C ++項目?

[英]How to determine whether or not EnvDTE.Project object represents a C/C++ project?

我有一個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 - 由於這個原因,代碼已經變得無法維護。

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

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

如上面的評論所述,EnvDTE.Project.Kind是第一個看的地方。 請參閱HOWTO:從加載項或宏中猜測Visual Studio項目的類型

有一些眾所周知的GUID 列表 ,請參閱INFO:已知項目類型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}。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM