以编程方式将现有项目添加到新VS2012解决方案中失败

时间:2012-07-25 10:36:32

标签: c# visual-studio-2012 envdte

我们在向导中有以下代码将现有项目添加到新解决方案中:

//generating files
if (dte.Solution.Projects.Count < 1) // Solution is empty or doesn't exist
{
    dte.Solution.Create(oneFolderHigher(Params.OutputDir, solutionName),
                        solutionFileName(solutionName));
}

// adding created project to solution
dte.Solution.AddFromFile(Path.Combine(Params.ProjectRootFolder, 
                                      Params.ProjectName + ".csproj"));

它在MS Visual Studio 2010下运行正常,但在2012年失败(我尝试了第二个参数):

  

System.Runtime.InteropServices.COMException(0x80004004):操作已中止(来自HRESULT的异常:0x80004004(E_ABORT))   在EnvDTE.SolutionClass.AddFromFile(String FileName,Boolean Exclusive)   在Wizard.Generator.NewProjectGenerator.Generate(Action`1 logMessage)   在Wizard.Forms.WizardForm.Finish()

发生此错误后,我手动将新项目添加到解决方案中,一切正常。但我们不能只说,“抱歉,我们无法为您添加新生成的项目,请自行添加。”

MSDN建议:

  

如果要在执行期间禁止其UI,可以使用LaunchWizard方法而不是AddFromFile来执行向导。 LaunchWizard有一个参数,允许您禁用UI。

但是这种方法需要一些向导文件,所以它不能成为解决方案。

有人可以帮忙吗? 向导正在从“新建 - &gt;项目”菜单运行。

1 个答案:

答案 0 :(得分:0)

此问题的解决方法(由我的老板提出):

Before adding the project to solution, project file should be converted to
VS2012 format.

但代码有点难看:

using (StreamReader sr = new StreamReader(newFile))
using (StreamWriter sw = new StreamWriter(projectFile, false, Encoding.UTF8))
{
     while (sr.Peek() >= 0)
     {
         string s = sr.ReadLine();
         if (s.Contains("<Project ToolsVersion=\"4.0\""))
         {
              s = s + Environment.NewLine + importProject;
         }
... and so on

也许有人知道这样做的方式真棒吗?我的意思是转换。我会在一段时间内回答这个问题。等待你的评论。