protected internal void RunVsTemplateWizard(ProjectElement element, bool silent) { ProjectElement elementToUse = (element == null) ? this.nestedProjectElement : element; if (elementToUse == null) { throw new ArgumentNullException("element"); } this.nestedProjectElement = elementToUse; Automation.OAProject oaProject = GetAutomationObject() as Automation.OAProject; if (oaProject == null || oaProject.ProjectItems == null) { throw new System.InvalidOperationException(SR.GetString(SR.InvalidAutomationObject, CultureInfo.CurrentUICulture)); } Debug.Assert(oaProject.Object != null, "The project automation object should have set the Object to the SolutionFolder"); Automation.OASolutionFolder <ProjectContainerNode> folder = oaProject.Object as Automation.OASolutionFolder <ProjectContainerNode>; // Prepare the parameters to pass to RunWizardFile string destination = elementToUse.GetFullPathForElement(); string template = this.GetProjectTemplatePath(elementToUse); object[] wizParams = new object[7]; wizParams[0] = EnvDTE.Constants.vsWizardAddSubProject; wizParams[1] = Path.GetFileNameWithoutExtension(destination); wizParams[2] = oaProject.ProjectItems; wizParams[3] = Path.GetDirectoryName(destination); wizParams[4] = Path.GetFileNameWithoutExtension(destination); wizParams[5] = Path.GetDirectoryName(folder.DTE.FullName); //VS install dir wizParams[6] = silent; IVsDetermineWizardTrust wizardTrust = this.GetService(typeof(SVsDetermineWizardTrust)) as IVsDetermineWizardTrust; if (wizardTrust != null) { Guid guidProjectAdding = Guid.Empty; // In case of a project template an empty guid should be added as the guid parameter. See env\msenv\core\newtree.h IsTrustedTemplate method definition. ErrorHandler.ThrowOnFailure(wizardTrust.OnWizardInitiated(template, ref guidProjectAdding)); } try { // Make the call to execute the wizard. This should cause AddNestedProjectFromTemplate to be // called back with the correct set of parameters. EnvDTE.IVsExtensibility extensibilityService = (EnvDTE.IVsExtensibility)GetService(typeof(EnvDTE.IVsExtensibility)); EnvDTE.wizardResult result = extensibilityService.RunWizardFile(template, 0, ref wizParams); if (result == EnvDTE.wizardResult.wizardResultFailure) { throw new COMException(); } } finally { if (wizardTrust != null) { ErrorHandler.ThrowOnFailure(wizardTrust.OnWizardCompleted()); } } }
/// <summary> /// Adds a reference to this container using the selector data structure to identify it. /// </summary> /// <param name="selectorData">data describing selected component</param> /// <returns>Reference in case of a valid reference node has been created or already existed. Otherwise null</returns> public ReferenceNode AddReferenceFromSelectorData(VSCOMPONENTSELECTORDATA selectorData) { //Make sure we can edit the project file if (!this.ProjectMgr.QueryEditProjectFile(false)) { throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); } //Create the reference node ReferenceNode node = null; try { node = CreateReferenceNode(selectorData); } catch (ArgumentException) { // Some selector data was not valid. } //Add the reference node to the project if we have a valid reference node if (node != null) { ReferenceNode existingNode; if (!node.IsAlreadyAdded(out existingNode)) { // Try to add node.AddReference(); if (null == node.Parent) { // The reference was not added, so we can not return this item because it // is not inside the project. return(null); } } else { IVsDetermineWizardTrust wizardTrust = this.GetService(typeof(SVsDetermineWizardTrust)) as IVsDetermineWizardTrust; var isWizardRunning = 0; if (wizardTrust != null) { ErrorHandler.ThrowOnFailure(wizardTrust.IsWizardRunning(out isWizardRunning)); } // if assembly already exists in project and we are running under the wizard - do not raise error if (isWizardRunning != 0) { return(existingNode); } else { string message = string.IsNullOrEmpty(node.SimpleName) ? String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.ReferenceAlreadyExists, CultureInfo.CurrentUICulture), node.Caption, existingNode.Caption) : String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.ReferenceWithAssemblyNameAlreadyExists, CultureInfo.CurrentUICulture), node.Caption, node.SimpleName, existingNode.Caption); throw new InvalidOperationException(message); } } } return(node); }