6

Mam instancję Project i nie rozumiem, jak znaleźć typ projektu/język. W szczególności muszę sprawdzić projekt C/C++.Jak ustalić, czy obiekt EnvDTE.Project reprezentuje projekt C/C++?

Wydaje się, że brakuje docs.

Wcześniej inna osoba dodawali następujący trochę magii do mojego open source VS rozszerzenia, i to działało w 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); 

Ale to już nie pracuje w VS 2017 RC. Chętnie pozbyłbym się tej magicznej refleksji runtime i nie wpisanej nazwy object i dynamic zamiast Project - kod ten jest już niemożliwy do utrzymania z tego powodu.

+0

Istnieje własność 'Kind' (https://msdn.microsoft.com/en-us/library/envdte.project.kind.aspx) dla' envdte.project'. To jest GUID. Istnieją predefiniowane typy projektów w 'PrjKind' (https://msdn.microsoft.com/en-us/library/vslangproj.prjkind.aspx), ale wydaje się, że nie ma właściwości dla c/C++. Domyślam się, że możesz uzyskać ten GUID i będzie on taki sam dla wszystkich projektów c/C++. –

+0

@AramKocharyan: Widziałem "Kind", ale nie ma listy możliwych "rodzajów", ani żadnej gwarancji, że rzeczywiście jest statyczna na różnych maszynach, instalacjach i wersjach VS ... –

+0

@ Violet-Giraffe: Czy rozwiązujesz kwestia? jeśli problem nadal występuje, proszę daj mi znać. –

Odpowiedz

1

można określić typ projektu za pomocą nazwy rozszerzenia projektu i poniższej wersji demonstracyjnej w celach informacyjnych.

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 jest pierwszym miejscem do spojrzenia, jak wspomniano w komentarzach powyżej. Zobacz HOWTO: Guess the type of a Visual Studio project from an add-in or macro

Istnieje lista niektórych znanych GUID, patrz INFO: List of known project type Guids.

Prawdopodobnie interesuje Cię {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}. Ale projekt może mieć różne podtypy, w którym to przypadku stosuje się do niego wiele identyfikatorów GUID. Na przykład MVC + C#. Zobacz HOWTO: Get the project flavor (subtype) of a Visual Studio project from an add-in

EnvDTE.Project.Kind zawiera główny typ projektu i nie ma gwarancji, że np. identyfikator GUID C++ będzie przechowywany w tej właściwości. Najbezpieczniejszym sposobem jest pobranie wszystkich GUID zastosowanych do projektu. Użyj metody GetProjectTypeGuids z ostatniego linku. Otrzymasz listę wszystkich identyfikatorów GUID, a następnie przetestujesz, czy zawiera ona {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}.

Powiązane problemy