0

Я пытаюсь создать фильтр (одну из маленьких папок, которая ничего не делает, кроме отдельных файлов в проекте) в шаблоне проекта визуальной студии (C++) с помощью мастера, поэтому я написав следующий код в методе RunStarted:Добавить фильтр в шаблон visual studio

public void RunStarted(object automationObject, 
     Dictionary<string, string> replacementsDictionary, 
     WizardRunKind runKind, object[] customParams) 
    { 
     try 
     { 
     // Add filters to the project 
     EnvDTE.DTE dte = (EnvDTE.DTE)automationObject; 

     Array activeProjects = (Array)dte.ActiveSolutionProjects; 
     Project activeProj = (Project)activeProjects.GetValue(0); 
     VCProject prj = (VCProject)activeProj.ProjectItems.Item(0); 
     VCFilter filter = prj.AddFilter("Header_Files"); 
     filter.AddFile("header.h"); 
     prj.Save(); 
     } 
     catch (Exception ex) 
     { 
     MessageBox.Show(ex.ToString()); 
     } 
    } 

Это не работает. Ошибка Возвращается:

System.IndexOutOfRangeException: Индекс находился вне границ этого массива.

на System.Array.InternalGetReference (Пустота * elemRef, Int32 звание, Int32 * pIndices)

на System.Array.GetValue (индекс Int32)

в my_wizard.IMyWizard.RunStarted (Object AutomationObject , Dictionary`2 replacementsDictionary, WizardRunKind runKind, Object [] customParams)

Где я получаю неправильно? Как добавить фильтр в шаблон vs?

ответ

1

Вы можете найти ответ here.
Некоторые говорят, что проблема возникает, когда Solution Explorer не открыт.
Вот мое решение на основе верхнего звена:

private Project getActiveProject(DTE2 dte) 
    { 
     Array projects = dte.ActiveSolutionProjects as Array; 
     if (projects == null || projects.Length == 0) 
     { 
      projects = dte.Solution.SolutionBuild.StartupProjects as Array; 
      if (projects == null || projects.Length == 0) 
      { 
       Projects pro = dte.Solution.Projects; 
       if (pro == null || pro.Count == 0) 
        return null; 
       return pro.Item(0); 
      } 
     } 
     return projects.GetValue(0) as Project; 
    }