从WPF应用程序启动和管理外部进程

时间:2013-08-20 14:58:52

标签: c# wpf process ipc system.diagnostics

我有一个WPF应用程序,我需要启动一个单独的MFC应用程序,然后与之通信。我打算使用Process.Start,但我想知道这些天是否有更好的方法来做到这一点。我可以自己研究,但我需要知道从哪里开始。感谢。

编辑:

我发现这表明没有。这是真的吗?

Alternatives to System.Diagnostics.Process.Start()

感谢。

1 个答案:

答案 0 :(得分:0)

对于您的直接问题,最新版本的.NET中没有任何新内容可以提供更好或更新的方式来启动本地可执行文件。 Process.Start是(并且一直)要走的路。

最简单,最方便的是在Process上选择五种静态方法之一。传递字符串或填充的StartInfo实例。如果您需要更多地控制进程如何引发,您可以使用后者。或者对您的情况感兴趣,如果您想将程序的stdio作为流传输到您自己的应用程序中。以下是从我的某个实用程序填充Start Info实例的示例...

        ProcessStartInfo start = new ProcessStartInfo(BaseIoConstantsProvider.CommandProcessor)
            {
                Arguments = BaseIoConstantsProvider.KeepAlive,
                UseShellExecute = false,
                CreateNoWindow = BaseIoConstantsProvider.NoDosWindow,
                RedirectStandardOutput = true,
                RedirectStandardInput = true,
                RedirectStandardError = true,
                WindowStyle = ProcessWindowStyle.Hidden,
            };

对于问题的第二部分,如果您需要在启动过程后与流程进行交互,则静态方法将无法执行。来自同一个实用程序...

        Process p = new Process { StartInfo = start, EnableRaisingEvents = true };
        p.ErrorDataReceived += PErrorDataReceived;
        p.Exited += PExited;
        p.Start();
        p.StandardInput.AutoFlush = true;
        p.StandardInput.WriteLine(cmdLine);
        p.BeginOutputReadLine();

此示例显示了两个事件被挂钩以及从进程中读取stdio。它非常适用于此目的,但如果您只是想启动另一个可执行文件,那就太过分了。

因此,选择启动方法的主要决定因素是:我的应用程序在启动后是否需要与流程进行交互?

最后,有时您可能想要调用规范动词,甚至创建自己的动词来启动给定的过程。当您右键单击某个项目时,它们会显示在上下文菜单中,并为您提供更多启动流程的灵活性。这里有一篇关于如何实现动词的优秀文章http://msdn.microsoft.com/en-us/library/windows/desktop/cc144101(v=vs.85).aspx#canonical