如何通过模板向导将现有项目添加到visual studio项目

时间:2011-12-07 16:03:53

标签: visual-studio templates wizard envdte

我想将现有项目添加到模板生成的新解决方案中。我可以通过vstemplate文件实现这一点,还是必须使用IWizard。如果我必须使用IWizard,我怎样才能正确使用它。目前我尝试了以下内容:

  1. 多项目模板,添加了一些解决方案文件夹和一个项目
  2. 带有自定义向导数据的向导。 $ wizarddata $包含一些已经存在于硬盘上的项目的相对路径。在向导中,我选择这些项目的基本路径。如何将此项目添加到我的解决方案中?
  3. 主要问题似乎是Solution对象不包含任何内容:

    var type = Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
    var dte2 = (EnvDTE80.DTE2)Activator.CreateInstance(type);
    var solution = (EnvDTE100.Solution4)dte2.Solution;
    var projects = dte2.ActiveSolutionProjects;
    

    项目不包含任何项目。这同样适用于dte2.Solution.Projects。此代码在IWizard实现的RunFinished函数中调用。或者:

    var type = Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
    var dte2 = (EnvDTE80.DTE2)Activator.CreateInstance(type);
    dte2.ExecuteCommand("File.AddExistingProject", "X:\\Path\\To\\Project\\ProjectName.csproj");
    

    将抛出COM异常。如果我从Visual Studio中的宏执行ExecuteCommand它将正常工作。我做错了什么?

1 个答案:

答案 0 :(得分:1)

好的,我发现了问题。上面创建DTE-Object的代码片段不正确。如果我记得RunStarted函数中的automationObject并将在RunFinished函数中使用它,一切都会按预期工作:

public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
    // ...
    dte = automationObject as DTE;
}

public void RunFinished()
{
    // ...
    // projects will automatically added relative
    dte.ExecuteCommand("File.AddExistingProject", "\""+path+"\"");
}