3

我有一个包含两个 exe 的应用程序。让我们称它们为MyApp.exeand MyAppStarter.exe。我MyAppStarter.exe这样做的原因是它可以首先在网络上检查是否有MyApp.exe可用的新版本,以便它可以在启动之前复制它 - 但现在这有点离题了。

我想要实现的是能够注册一个自定义 URL 协议处理程序,MyAppStarter.exe以便我可以将某种起始条件传递给MyApp.exe. 例如,如果用户单击电子邮件中指向myapp://userid=123的链接,它应该启动应用程序并立即查看用户 ID 为 123 的用户。或者如果链接是myapp://accid=456它应该立即使用 accid 456 查看帐户。我知道该怎么做,方法是注册自定义 URL 协议处理程序MyAppStarter.exe,然后MyApp.exe使用某些参数注册 shell。到目前为止,一切都很好。

现在的问题是,应该MyApp.exe已经在运行,我想MyAppStarter.exe识别(我可以这样做)并给它焦点(我也可以这样做)并指示它显示用户或帐户或具有指定 id 的任何内容(这是我卡住的地方)。

我查看了有关如何使用匿名管道进行本地进程间通信的 MSDN 文档。这似乎很简单,但有两件事我不清楚:

  1. 如何在两者之间传达管道句柄,以便首先建立管道?请记住,MyApp.exe可能已经在MyAppStarter.exe执行点运行。

  2. 在我的场景中,我想这MyAppStarter.exe将是服务器,而MyApp.exe将是客户端。这意味着我必须设置一个计时器,MyApp.exe每隔一段时间检查管道以获取来自MyAppStarter.exe. 我对这个想法并不生气。只是这个要求是操作的一个很小的部分,MyApp.exe所以它每秒触发一个计时器,或者无论如何经常看起来,我应该说,不太优雅。我会喜欢的,我可以简单地在 , 中定义一个函数MayApp.exe,调用void PerformInstruction(string instruction)它可以从MyAppStarter.exe

4

2 回答 2

2

当您使用管道/套接字时,您将一直运行一个线程来处理来自 MyStarterApp.exe 的请求。您的客户端将等待 ReadLine 完成,您将继续阅读,直到您从服务器收到一些信号到 FIN 或管道从另一端关闭,在这种情况下,您将方法返回 NULL。确保阅读 StreamReader 的行为。

在您的 MyApp.exe 中,您将需要该线程与 UI/消费者进行通信并选择适当的用户。

于 2015-07-09T11:18:58.003 回答
0

.NET Remoting 使这变得非常简单。许多人认为这项技术已经过时,但它仍然功能齐全,并且在 .NET 中根深蒂固。我怀疑它会很快消失。对于本地机器 IPC 或 AppDomain “IPC”,我认为 Remoting 是一个很好的解决方案。

IpcChannel课堂做你想做的事。从本教程中,您可以看到实现这一目标是多么容易。不需要交换管道句柄,因为端点是命名的。

不要错误地在命名管道上编写自己的二进制协议。不过,您可以随意选择 Remoting 以外的其他东西。

制作MyApp服务器和MyAppStarter客户端。如果MyApp没有运行连接应该立即失败(不需要超时)。

于 2015-07-09T11:23:13.363 回答