2013-06-04 2 views
0

Мой вопрос очень похож на этот: How to cast ComObject to ENVDTE.Project?Как передать ComObject в ENVDTE.Project для Unmodeled проектов?

Я хочу обработать элементы проекта, выбранные в Visual Studio -> Solution Explorer. Если проект загружается код работает нормально, но у меня есть проблемы для ненагруженных проектов (они называются Unmodeled проектов (http://msdn.microsoft.com/en-us/library/hw7ek4f4%28v=vs.80%29.aspx).

Кастинг выбранного элемента для нагруженных проектов uiItem.Object является EnvDTE.Project это хорошо, но как отливать Unmodeled проекты Существует класс и литье uiItem.Object является ProjectItem не работает нет «UnmodeledProject»

Это мой код:.

Window solutionExplorer = mApplicationObject.Windows.Item(Constants.vsWindowKindSolutionExplorer); 
if(solutionExplorer != null) 
{ 
    UIHierarchy uiHierarchy = (UIHierarchy)solutionExplorer.Object; 
    if (uiHierarchy != null) 
    { 
     object[] selectedItems = (object[])uiHierarchy.SelectedItems; 
     foreach (UIHierarchyItem uiItem in selectedItems) 
     {        
      // Valid project 
      if (uiItem.Object is EnvDTE.Project) 
      { 
       EnvDTE.Project project = uiItem.Object as EnvDTE.Project; 
       if (project.FullName.Contains(".vdproj") || project.Kind == "{54435603-DBB4-11D2-8724-00A0C9A8B90C}") 
       { 

       } 
      } 
      else if (uiItem.Object is ProjectItem) 
      { 
       // This is never jumped... 
      } 
      else 
      { ... 

ответ

0

Как я не нашел решение этой ситуации, я использовал этот трюк:

string pathToVdProject = null; 
try 
{ 
    Window solutionExplorer = mApplicationObject.Windows.Item(Constants.vsWindowKindSolutionExplorer); 
    if (solutionExplorer != null) 
    { 
     UIHierarchy uiHierarchy = (UIHierarchy)solutionExplorer.Object; 
     if (uiHierarchy != null) 
     { 
      object[] selectedItems = (object[])uiHierarchy.SelectedItems; 
      foreach (UIHierarchyItem uiItem in selectedItems) 
      { 
       // Valid project 
       if (uiItem.Object is EnvDTE.Project) 
       { 
        EnvDTE.Project project = uiItem.Object as EnvDTE.Project; 
        if (project.FullName.Contains(".vdproj") || project.UniqueName.Contains(".vdproj") 
         || (String.Compare(project.Kind, ProjectsGuids.guidVdSetupProject, true) == 0))          
        { 
         // Valid Project has property FullName which is full path to .vdproj file 
         pathToVdProject = project.FullName; 
         break; 
        } 
       } 
       else if (uiItem.Object is ProjectItem) 
       { 
        // This never happens... 
       } 
       else 
       { 
        // This is a little tricky: Unmodeled Projects cannot be casted to EnvDTE.Project http://msdn.microsoft.com/en-us/library/hw7ek4f4%28v=vs.80%29.aspx 
        Solution2 solution = (Solution2)mApplicationObject.Solution; 

        // So get all projects in solution (including unmodeled) and try to find a match by name 
        foreach (Project project in solution.Projects) 
        { 
         if (project.Kind == EnvDTE.Constants.vsProjectKindUnmodeled) 
         { 
          // Unmodeled project found (Normal projects are recognized in 'uiItem.Object is EnvDTE.Project' 
          if (project.Name.Contains(uiItem.Name)) 
          { 
           // This is 'Project' for selected item 
           if (project.Name.Contains(".vdproj") || project.UniqueName.Contains(".vdproj")) 
           { 
            // Unmodeled projects does not offer property FullName and UniqueName does NOT contain full path to file! 
            FileInfo fileInfo = new FileInfo(solution.FullName); 

            // Create full path from solution (.sln) path and project relative path 
            pathToVdProject = fileInfo.DirectoryName + "\\" + project.UniqueName; 
            break; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
0

Список всех лоа Выделенные/выгруженные проекты внутри проводника решений будут доступны в вашем объекте приложения EnvDTE. Без использования окна Explorer Explorer и UIHierarchy я получил детали проекта. Ниже фрагменты кода работают отлично для меня. Пожалуйста, проверьте погоду она будет соответствовать для вас ..

For Each item As EnvDTE.Project In mApplicationObject.Solution.Projects 
    If item.Globals Is Nothing AndAlso item.Object Is Nothing Then 
     Console.WriteLine(item.Name + " is currently unloaded!") 
    End If 
Next 
+0

Нет, это способ, которым я не хочу идти , Я хочу распознать класс выбранного элемента, но спасибо за этот комментарий. – Slappy

 Смежные вопросы

  • Нет связанных вопросов^_^