C# 从WPF应用程序启动和管理外部流程

C# 从WPF应用程序启动和管理外部流程,c#,wpf,process,ipc,system.diagnostics,C#,Wpf,Process,Ipc,System.diagnostics,我有一个WPF应用程序,我需要启动一个单独的MFC应用程序,然后与之通信。我打算使用Process.Start,但我想知道最近是否有更好的方法来实现这一点。我可以自己研究,但我需要知道从哪里开始。谢谢 编辑: 我发现这表明没有。这是真的吗 谢谢。对于您当前的问题,在.NET的最新版本中,没有什么新的东西可以提供更好或更先进的方式来启动本地可执行文件。过程。开始是(并且一直是)一条路要走 最简单、最方便的方法是在流程上选择五种静态方法之一。传递字符串或已填充的StartInfo实例。如果您需要更

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

编辑:

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


谢谢。

对于您当前的问题,在.NET的最新版本中,没有什么新的东西可以提供更好或更先进的方式来启动本地可执行文件。过程。开始是(并且一直是)一条路要走

最简单、最方便的方法是在流程上选择五种静态方法之一。传递字符串或已填充的StartInfo实例。如果您需要更多地控制流程的启动方式,可以使用后者。或者,如果您希望将程序的stdio作为流传输到您自己的应用程序中,您可能会对此感兴趣。下面是从我的一个实用程序填充开始信息实例的示例

        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的同时被钩住。这对于这个目的来说是很好的,但是如果你只是想启动另一个可执行文件,那就太过分了

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


最后,有时您可能希望调用规范动词,甚至创建自己的动词来启动给定的过程。当您右键单击某个项目时,它们会出现在关联菜单中,为您启动流程提供了更多的灵活性。这里有一篇关于如何实现动词的优秀文章。

您使用的是静态方法还是获取开始信息的方法?请清楚地解释“与它通信”的含义。您希望能够执行什么通信?@GarryVass,我也不确定它们之间有什么区别,只是“开始信息”允许进行更详细的通信。@Sheridan,我说的是进程间通信。除非有更好、更干净的方法,否则我打算使用WM_COPY。我想问的是,是否有另一种方式来运行一个流程,使沟通更容易。因为这是一个MFC项目,我甚至很难知道应用程序何时启动。而且几乎不可能获得它的主窗口句柄,因为
MainWindowHandle
不工作。我的计划是使用内存映射文件来获取句柄。乔丹,考虑到这一点,你需要考虑如何将你的问题与民意调查区分开来。但总的来说,如果你想从MFC应用程序中捕获stdio,我会使用start info方法,否则就坚持使用规范的静态方法。我没有使用这种方法,因为我托管的应用程序不支持标准IO。但这确实给了我灵感,让我创建了一个物品库,让我的生活变得更加轻松。谢谢。@Jordan,当你的库稳定下来后,你可以把它放在Codeplex上,然后喊我一声。因为我必须一直做这类事情,因此我很小心。