2011-12-07 104 views
1

我想将现有项目添加到由模板生成的新解决方案。我可以通过vstemplate文件来实现,还是必须使用IWizard。如果我必须使用IWizard,我该如何正确使用它。目前,我试过如下:如何通过模板向导将现有项目添加到Visual Studio项目

  1. 多重模板,增加了一些解决方案的文件夹和一个项目
  2. 向导定制wizarddata。 $ 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异常。如果我从Visual Studio中的宏执行ExecuteCommand,它将正常工作。我究竟做错了什么?

回答

1

好吧,我发现了这个问题。上面的代码段与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+"\""); 
} 
+0

我也用这种方法来获取服务器资源管理器连接管理器。使用下面的代码:var dte = automationObject as DTE; Microsoft.VisualStudio.Shell.ServiceProvider sp = new Microsoft.VisualStudio.Shell.ServiceProvider((IOleServiceProvider)dte); IVsDataExplorerConnectionManager seConnectionsMgr =(IVsDataExplorerConnectionManager)sp.GetService(typeof(IVsDataExplorerConnectionManager).GUID);希望这可以节省一些时间给其他人。 – gab

相关问题