天天看点

C#程序启动和关闭外部程序(转)

1 方法

主要使用Process类。位于System.Diagnostics命名空间

有两类方法

(1)一种是定义一个Process实例,对这个实例的属性进行配置,然后启动它。类似与【2】中那样。如下:

System.Diagnostics.Process p = new System.Diagnostics.Process();

p.StartInfo.FileName = AppConst.EngineFilePath; //exe程序文件地址

p.StartInfo.UseShellExecute = false;

p.StartInfo.RedirectStandardInput = false;

p.StartInfo.RedirectStandardOutput = false;

p.StartInfo.RedirectStandardError = false;

p.StartInfo.CreateNoWindow = true; //不弹出窗口,改为后台运行

p.StartInfo.Arguments = sb.ToString(); //参数 多个参数使用空格分开

p.Start();

p.WaitForExit();

p.Close();

(2)另一种是利用Process的系统直接启动一个,可能就没法设置好多的东西了,类似于【1】中那样。

private string appName = "calc.exe";

private void button1_Click(object sender, EventArgs e)

{

Process.Start(appName);

MessageBox.Show(String.Format("外部程序 {0} 启动完成!", this.appName), this.Text,

MessageBoxButtons.OK, MessageBoxIcon.Information);

}

2 启动等待等

参见【1】中,可以等待等。

3 其他注意

(1)新进程的工作目录

不设置时为调用者的工作目录,如果不同,通过WorkingDirectory设置。如下:

p.StartInfo.WorkingDirectory = "X:\\spinning";

(2)进程的退出

有2种方法:kill和CloseMainWindow。

后者适用于有窗口的。能释放干净相关资源。

而前者适用于所有。强制的杀死,可能带来资源释放不干净等问题。

Process proc = Process.Start(appName);

....

proc.Kill();

我遇到的一个问题:

我使用上述方法,启动一个程序的时候,他同时启动了两个同样名称的进程。

上面的代码只能杀死一个,为此,改进了一种方法,按照名称杀死进程,将两个全部干掉。前提是这两个进程同名。

string processName = "XX": //名称一般为程序的名字,不带后缀名exe。的可通过 p.ProcessName查看

System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName(processName);

foreach (System.Diagnostics.Process p in ps)

if(!p.HasExited) //当没有退出时,杀死他

p.Kill();