0

我正在尝试使用向导在 Visual Studio (C++) 项目模板中创建一个过滤器(其中一个除了项目中的单独文件之外什么都不做的小文件夹),因此我在 RunStarted 方法中编写了以下代码:

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(Void* elemRef,Int32 等级,Int32* pIndices)

在 System.Array.GetValue(Int32 索引)

在 my_wizard.IMyWizard.RunStarted(对象自动化对象,字典`2 替换字典,WizardRunKind runKind,对象 [] customParams)

我哪里错了?如何向 vs 模板添加过滤器?

4

1 回答 1

1

你可以在这里找到答案。
有人说当解决方案资源管理器未打开时会出现问题。
这是我基于上层链接的解决方案:

    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;
    }
于 2014-02-14T14:47:00.870 回答