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

Posted

技术标签:

【中文标题】使用 devenv 以编程方式清理解决方案【英文标题】:programmatically clean solution using devenv 【发布时间】:2016-01-08 05:25:38 【问题描述】:

我正在尝试使用 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: 01", 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

中得到空字符串作为其最终输出

【问题讨论】:

您可能需要查看“StandardError”。 什么是commnad 【参考方案1】:

这不是它的工作原理,你不能使用vcvarsall 作为命令和devenv ... 作为参数。

作为ProcessStartInfo.FileName 使用“cmd.exe”,或者更好:

Environment.ExpandEnvironmentVariables("%comspec%")

作为ProcessStartInfo.Arguments 使用:

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

&lt;...&gt; 是代码中已有的片段(目录、参数等)。

请注意,您应该明确使用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);

【讨论】:

我尝试了你建议的更改,但仍然没有执行干净我的 bin & obj 仍然包含编译器生成的文件 在命令提示符窗口中运行命令(由FileNameArguments 构建)会发生什么? 实际上我是从控制器内的 Web 应用程序调用 CleanSolution() 我刚刚收到我的成功消息 - “清理成功”。我的 CleanSolution() 在我的服务中定义。 进一步的故障排除需要您查看正在执行的实际命令的输出。所以要么手动运行它,就像我在上一条评论中建议的那样,要么重定向 Process 输出并将其写入某处(日志等) - 稍后有很多关于 SO 的示例。 我已经重定向了进程输出但是得到了空字符串,请看上面的代码

以上是关于使用 devenv 以编程方式清理解决方案的主要内容,如果未能解决你的问题,请参考以下文章

由于缺少依赖项,MSBuild 清理操作失败

使用 Msbuild 和 devenv 在项目解决方案下构建特定的 Visual Studio 项目

以编程方式清理 UI 的实现

如何以编程方式清理 RAM 可可?

通过 Devenv 命令行构建时禁用代码分析

VS启动越来越慢