使用 devenv 以编程方式清理解决方案
programmatically clean solution using 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
中得到空字符串作为其最终输出
这不是它的工作原理,你不能使用 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);
我正在尝试使用 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
中得到空字符串作为其最终输出这不是它的工作原理,你不能使用 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);