我试图使用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
我期待着: - 在启动器完成更新/检查重要文件后,它会发送打开主应用程序的请求,当它这样做时,它会关闭自己。
- 之后,主应用程序将像以前一样正常运行。
2条答案
按热度按时间w6lpcovy1#
双方都在创建一个
NamedPipeServerStream
并等待另一方连接;其中一个应该是NamedPipeClientStream
并建立连接。或者,您可以使用匿名管道(
ProcessStartInfo.RedirectStandardOutput
和朋友)。当您有父/子进程关系时,这是一种更常见的方法。b0zn9rqh2#
由于社区可以帮助我,我觉得我应该发布更正的代码,也许这将帮助未来有类似问题的人:
主应用侧(固定):