下面的例子是,开启以Sql server的安装进程运行:
private void button1_Click(object sender, EventArgs e)
{
try
{
Process tmpSqlInstaller = new Process();
string tmpFileName =
@"G:\StudyFolder\CSharpPractice\ConsoleAppEmbedingSqlServer\ConsoleAppEmbedingSqlServer\SqlExpressSetUp\setup.exe";
string tmpArguments =
@"/IACCEPTSQLSERVERLICENSETERMS "
+ "/Q "
//+ "/Hideconsole "
+ "/ACTION=Install "
+ "/FEATURES=SQLEngine,Replication,SDK "
+ "/INSTANCENAME=SQLEXPRESS_1 "
+ "/AddCurrentUserAsSQLAdmin "
+ "/SQLSVCACCOUNT=\"NT AUTHORITY\\SYSTEM\" "
+ "/AGTSVCACCOUNT=\"NT AUTHORITY\\Network Service\"";
ProcessStartInfo tmpStartInfo = new ProcessStartInfo(tmpFileName, tmpArguments);
//---
tmpSqlInstaller.StartInfo = tmpStartInfo;
tmpSqlInstaller.EnableRaisingEvents = true;
tmpSqlInstaller.Exited += new EventHandler(tmpSqlInstaller_Exited); //这里对于要依赖进程安装结果而执行相应逻辑的程序很有用
tmpSqlInstaller.Start();
MessageBox.Show("i have started");
}
catch (Exception allE)
{
MessageBox.Show(allE.ToString());
}
}
void tmpSqlInstaller_Exited(object sender, EventArgs e)
{
//MessageBox.Show("Process has exited");
System.Diagnostics.Debug.WriteLine("Process has exited");
Process tmpP = sender as Process;
if (tmpP != null)
{
System.Diagnostics.Debug.WriteLine(Convert.ToString(tmpP.ExitCode,16));// tmpP.ExitCode.ToString());
}
}
注:
在开启另一个进程运行的程序,如果那个程序发生任何错误是不会抛回到调用进程的,
能在调用进程中唯一感知开启进程状态的部分就是Exit事件的处理方法中,另如果开启了错误重定向功能,
也可以在调用进程中,记录开启进程运行时产生的错误日志。
所以,在 主调进程代码处添加try...catch语句显然无法做到捕捉被调进程中放生的错误。
调用进程=主调进程
开启进程=被调进程