【问题标题】:Call a C# application from an existing C# application with ProcessStartInfo?使用 ProcessStartInfo 从现有 C# 应用程序调用 C# 应用程序?
【发布时间】:2021-07-27 07:00:50
【问题描述】:

我有一个包含 2 个项目的解决方案:

xxxMode2 可以构建为独立的桌面应用程序。 xxxTable 项目是一个启动器。我会从 xxxTable 调用 xxxMode2。

以下是我用来从项目 xxxTable 调用项目 xxxMode2 的 2 个代码示例。我们称它们为 A 和 B。

        // Code A
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            Xxxxx.MainWindow mnw = new Xxxxx.MainWindow();
            mnw.Owner = this;
            mnw.ShowDialog();
        }
        // Code B
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            string currentFolder = Directory.GetCurrentDirectory();
            ProcessStartInfo pInfo = new ProcessStartInfo("xxx.xxx.xx.exe");
            pInfo.WorkingDirectory = currentFolder;            
            Process p = Process.Start(pInfo);
        }

在C#中,使用Classic方式(代码A)和Process方式(代码B)从主项目调用子项目有什么区别?

当我想在我的代码中启动一个 exe extern 时,我会使用这个 ProcessStartInfo() 方法。从我的主项目到我的子项目这样做是正确的还是有意义的?

【问题讨论】:

  • 第一个是直接实例化主窗口类,这里你可以控制它的各种属性。而在 processinfo 的情况下,它只是启动另一个应用程序,不管它是什么类型。
  • “调用子项目” - 是一个错误的术语。当另一个程序集是解决方案的一部分时,它会被链接、引用,您可以使用它的所有 public 类型、调用带有参数的方法、将结果作为返回值等。启动一个进程,您将它作为“黑色”运行框”,并且需要某种形式的进程间通信 (IPC) 才能执行任何操作。

标签: c# desktop-application


【解决方案1】:

不同之处在于,当您使用 A 方法时,您可以完全控制该对话框。它只是同一进程中的一个窗口。

但是,使用方法 B,您正在创建一个子进程,这意味着您无法访问刚刚使用 Process 类启动的程序的变量和其他数据。这样您就打开了一个新进程

如果您使用方法 B,您仍然可以与您的程序通信,您可以使用standard streams

如果大多数时候可以,最好使用方法 A,如果由于某种原因你不能,那么方法 B 就可以了。这实际上取决于项目和您想要实现的目标,但方法 A 应该几乎总是要走的路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多