使用devenv以编程方式清理解决方案

时间:2016-01-08 05:25:39

标签: c# devenv

我正在尝试使用C#清除代码中的所有项目。我使用了devenv clean commnad,我的方法正确执行,没有任何异常但是没有对解决方案执行任何操作。我的解决方案中所有项目的bin和obj文件夹仍包含编译器生成的文件。请告诉我问题在哪里。

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

中获取空字符串作为其最终输出

1 个答案:

答案 0 :(得分: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);