2016-01-08 9 views
2

Я пытаюсь очистить все проекты в решении от кода, использующего C#. Я использую devenv clean commnad, мой метод выполняется правильно без каких-либо исключений, но никаких действий в решении не выполняется. Вся папка bin и obj в моем решении по-прежнему содержит файлы, сгенерированные компилятором. Пожалуйста, дайте мне знать, где проблема.programatically clean solution using devenv

C# код

public string CleanSolution(BO.Project project) 
    { 
     try 
     { 
      if (!File.Exists(project.SolutionFilePath)) return "Solution file not found"; 
      var cleanCommand = "Devenv " + project.SolutionFilePath + " /Clean"; 

      //var cleanProcess = Process.Start(@"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe", cleanCommand); 
      //if (cleanProcess != null) cleanProcess.WaitForExit(); 

      System.Diagnostics.Process process = new System.Diagnostics.Process(); 
      System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
      startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
      startInfo.FileName = Environment.ExpandEnvironmentVariables("%comspec%"); 
      startInfo.Arguments = string.Format(@"/c ""c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" && devenv.com ""{0}"" /Clean",project.SolutionFilePath); 
      process.StartInfo = startInfo; 
      process.StartInfo.RedirectStandardOutput = true; 
      process.StartInfo.RedirectStandardError = true; 
      process.StartInfo.UseShellExecute = false; 
      process.Start(); 
      // Read the error stream first and then wait. 
      string error = process.StandardError.ReadToEnd(); 
      StringBuilder q = new StringBuilder(); 
      while (!process.HasExited) 
      { 
       q.Append(process.StandardOutput.ReadToEnd()); 
      } 
      string r = q.ToString(); 
      var message = "Clean Succeeded"; 
      IsClean = true; 
      return message; 
     } 
     catch (Exception e) 
     { 
      return string.Format("Message: {0}", e.Message) + Environment.NewLine + 
        string.Format("Stack Tracke: {0}{1}", Environment.NewLine, e.StackTrace) + Environment.NewLine + 
        (e.InnerException != null 
         ? string.Format("Inner Exception: {0}", e.InnerException.Message) + Environment.NewLine 
         : string.Empty) + Environment.NewLine + 
        (e.InnerException != null 
         ? string.Format("Inner Exception Stack Tracke: {0}", e.InnerException.StackTrace) + 
          Environment.NewLine 
         : string.Empty) + Environment.NewLine; 
     } 
    } 

Я попытался перенаправить вывод процесса с тем, чтобы посмотреть, что происходит, но я получаю пустую строку в качестве окончательного вывода в переменной processOutput

+0

Вам может понадобиться, чтобы посмотреть на "StandardError" вместо этого. –

ответ

2

Это не так, как это работает, вы не можете использовать команду vcvarsall как команду и devenv ... в качестве аргументов.

Как ProcessStartInfo.FileName использование "cmd.exe", или лучше:

Environment.ExpandEnvironmentVariables("%comspec%") 

Как ProcessStartInfo.Arguments использования:

@"/c <...>\vcvarsall.bat && devenv.com <...>" 

Где <...> являются фрагменты (каталог, аргументы и т.д.) у вас уже есть в вашем коде.

Обратите внимание, что вы должны явно использовать devenv.com (версия командной строки без окон), чтобы убедиться, что не используется devenv.exe (обычное приложение).

Чтобы сделать вещи более надежными, вы должны убедиться, что ваши пути правильно указаны.

Вот полный пример:

startInfo.FileName = Environment.ExpandEnvironmentVariables("%comspec%") 
startInfo.Arguments = string.Format(
    @"/c """"c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" && devenv.com ""{0}"" /Clean""", 
    project.SolutionFilePath); 
+0

Я попробовал изменения, предложенные вами, но все еще чистые не выполняются. Bin и obj по-прежнему содержат файлы, сгенерированные компилятором. – rupinder18

+0

Что происходит, когда вы запускаете команду (как создается 'FileName' и' Arguments') в окне командной строки? –

+0

Фактически я вызываю CleanSolution() из своего веб-приложения внутри контроллера. Я просто получаю сообщение о своем успехе - «Чистое преуспевание». Мой CleanSolution() определен в моей службе. – rupinder18

 Смежные вопросы

  • Нет связанных вопросов^_^