【问题标题】:Start and manage external process from a WPF app从 WPF 应用程序启动和管理外部进程
【发布时间】:2013-08-22 16:50:33
【问题描述】:

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

编辑:

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

Alternatives to System.Diagnostics.Process.Start()

谢谢。

【问题讨论】:

  • 你是使用静态方法还是获取启动信息的方法?
  • 请清楚地解释您所说的“与它交流”是什么意思。您希望能够进行什么样的沟通?
  • @GarryVass,或者,我不确定它们有何不同,除了开始信息允许更详细。
  • @Sheridan,我说的是进程间通信。除非有更好、更清洁的方法,否则我将使用 WM_COPY。我在这里要问的是是否有另一种方式来运行可以使沟通更容易的流程。因为它是一个 MFC 项目,所以我什至无法知道应用程序何时启动。而且几乎不可能获得其主窗口的句柄,因为MainWindowHandle 不起作用。我的计划是使用内存映射文件来获取句柄。这并不理想。
  • @Jordan,鉴于此,您需要考虑如何将您的问题与民意调查区分开来。但总的来说,如果您想从 MFC 应用程序中捕获标准输入输出,我会使用 start info 方法,否则请坚持使用规范的静态方法。

标签: c# wpf process ipc system.diagnostics


【解决方案1】:

对于您的直接问题,.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();

这个例子显示了两个事件被挂钩以及从进程中读取标准输入输出。它非常适合这个目的,但如果你只是想启动另一个可执行文件,那就大材小用了。

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

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

【讨论】:

  • 我没有使用这种方法,因为我托管的应用程序不支持标准 IO。但这确实给了我创建对象库的灵感,让我的生活变得如此轻松。谢谢。
  • @Jordan,当你的库稳定时,你可以把它放在 Codeplex 上,然后给我留言。因为我必须一直做这种事情,所以我要注意了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
相关资源
最近更新 更多