Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何通过模板向导将现有项目添加到visual studio项目_Visual Studio_Templates_Wizard_Envdte - Fatal编程技术网

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

Visual studio 如何通过模板向导将现有项目添加到visual studio项目,visual-studio,templates,wizard,envdte,Visual Studio,Templates,Wizard,Envdte,我想将现有项目添加到由模板生成的新解决方案中。我可以通过vstemplate文件实现这一点,还是必须使用IWizard。如果我必须使用IWizard,我如何才能正确地使用它。目前我尝试了以下方法: 多项目模板,用于添加一些解决方案文件夹和一个项目 具有自定义向导数据的向导$wizarddata$包含一些指向硬盘上已存在的项目的相对路径。在向导中,我为这些项目选择基本路径。现在如何将此项目添加到解决方案中 主要问题似乎是解决方案对象不包含任何内容: var type = Type.GetTypeF

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

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

    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异常。如果我在VisualStudio中从宏执行ExecuteCommand,它将正常工作。我做错了什么?

    好的,我发现了问题。上面创建DTE对象的代码段不正确。如果我记得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+"\"");
    }
    
    public void RunStarted(对象自动对象、字典替换Dictionary、向导runKind runKind、对象[]customParams)
    {
    // ...
    dte=作为dte的自动对象;
    }
    public void RunFinished()
    {
    // ...
    //项目将自动添加到相对位置
    dte.ExecuteCommand(“File.AddExistingProject”,“\”+路径+“\”);
    }
    
    我还使用这种方法来获取服务器资源管理器连接管理器。使用此代码:var dte=自动对象作为dte;Microsoft.VisualStudio.Shell.ServiceProvider sp=新的Microsoft.VisualStudio.Shell.ServiceProvider((IOleServiceProvider)dte);IVsDataExplorerConnectionManager seConnectionsMgr=(IVsDataExplorerConnectionManager)sp.GetService(typeof(IVsDataExplorerConnectionManager.GUID);希望这能为其他人节省一些时间。