wpf C# -使用命名管道进行进程间通信(我做错了什么?)

vddsk6oq  于 2023-10-22  发布在  C#
关注(0)|答案(2)|浏览(171)

我试图使用IPC允许我的应用程序通过启动器打开独占。为此,我决定使用命名管道来传递“请求”,并在更新和校验完成后打开我的主应用程序的登录窗口,但我对C#很陌生,遇到了一些问题,我似乎无法找到它们的起源。
所有更新完成后,启动器创建并请求打开应用程序,主应用程序打开,然后立即关闭,没有任何错误消息/日志。但是如果我尝试独立打开应用程序,那么它会打开(并保持这种状态),但仅在进程列表中,这本身就是另一个巨大的问题。

启动器端- MainWindow.xaml.cs:

private static async Task StarterAsync()
{
    string executablePath = "Application.exe";

    try
    {
        Process.Start(executablePath);

        using NamedPipeServerStream pipeServer = new("MyAppNP", PipeDirection.Out);
        await pipeServer.WaitForConnectionAsync();

        byte[] messageBytes = Encoding.UTF8.GetBytes("LaunchRequest");
        await pipeServer.WriteAsync(messageBytes);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: " + ex.Message);
    }
    finally
    {
        Application.Current.Shutdown();
    }
}

主应用端- App.xaml.cs:

namespace MyApp
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            string pipeName = "MyAppNP";
            using NamedPipeServerStream pipeServer = new(pipeName, PipeDirection.In);

            try
            {
                pipeServer.WaitForConnection();

                byte[] buffer = new byte[256];
                int bytesRead = pipeServer.Read(buffer, 0, buffer.Length);
                string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);

                if (message == "LaunchRequest")
                {
                    Login.Login loginWindow = new();
                    loginWindow.Show();
                }
                else
                {
                    MessageBox.Show("Launcher request mismatch. Exiting the application.");

                    pipeServer.Close();
                    Current.Shutdown();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);

                pipeServer.Close();
                Current.Shutdown();
            }
        }
    }
}

有经验的人可以帮助我找到导致所有这些问题发生的原因吗?

我试过:

  • 我检查了一些日志,但找不到与这些问题相关的任何内容。
  • 我还没有尝试任何调试,我只是太沮丧了,只想在接下来的12个小时里远离任何与代码相关的东西XD
    我期待着:
  • 在启动器完成更新/检查重要文件后,它会发送打开主应用程序的请求,当它这样做时,它会关闭自己。
  • 之后,主应用程序将像以前一样正常运行。
w6lpcovy

w6lpcovy1#

双方都在创建一个NamedPipeServerStream并等待另一方连接;其中一个应该是NamedPipeClientStream并建立连接。
或者,您可以使用匿名管道(ProcessStartInfo.RedirectStandardOutput和朋友)。当您有父/子进程关系时,这是一种更常见的方法。

b0zn9rqh

b0zn9rqh2#

由于社区可以帮助我,我觉得我应该发布更正的代码,也许这将帮助未来有类似问题的人:

主应用侧(固定):

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    string pipeName = "MyAppNP";

    try
    {
        using NamedPipeClientStream pipeClient = new(".", pipeName, PipeDirection.In);
pipeClient.Connect();

            byte[] buffer = new byte[256];
            int bytesRead = pipeClient.Read(buffer, 0, buffer.Length);
            string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);

            if (message == "LaunchRequest")
            {
                
            }
            else
            {
                MessageBox.Show("Launcher request mismatch. Exiting the application.");
                Current.Shutdown();
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: " + ex.Message);
        Current.Shutdown();
    }
}

相关问题