Silverlight 检测正在运行的 sllauncher.exe

本文关键字:sllauncher exe 运行 检测 Silverlight | 更新日期: 2023-09-27 18:37:23

我们正在Windows XP Box上运行浏览器外的Silverlight应用程序。有时,此应用程序挂起,必须关闭。当我们在这种情况下尝试重新启动应用程序时,应用程序以奇怪的状态启动。我们查看任务管理器,看到sllauncher.exe的多个实例正在运行。解决方案是终止 sllauncher.exe 实例并重新启动应用程序(当然,真正的解决方案是处理导致应用程序首先挂起的问题......

我想做的是,在我们的 silverlight 应用程序启动时,检测 sllauncher.exe 的多个实例是否正在运行,并向用户显示一条消息,指示应采取哪些纠正措施。我的浏览器外 silverlight 应用程序是否可以访问正在运行的进程的列表?

Silverlight 检测正在运行的 sllauncher.exe

我们就是这样做的...

我们创建了一个消息接收器。如果我们无法使用相同的键侦听,那么我们假设另一个实例正在运行。然后,我们询问用户是要终止当前实例还是已运行的实例。在收到的消息事件处理程序中,如果消息进来,我们将终止窗口。不是最优雅的解决方案,但它奏效了。最重要的是提请注意多个实例正在运行的事实。

try
{
    LocalMessageReceiver receiver = new LocalMessageReceiver("There can be only one");
    receiver.Listen();
    receiver.MessageReceived += receiver_MessageReceived;
}
catch (ListenFailedException)
{
    log.Info("Another instance is running.");
    // Display message, take corrective action etc.
    interactionService.ShowMessage(Strings.OneInstanceAllowed,
                                           Strings.ApplicationName, DialogButton.OKCancel, DialogImage.Question,
                                           OnCloseClientResponse);
}

很有可能,你也可以在 P/Invoke 中使用 TerminateProcess 杀死它们 - 只要你有提升的权限。

正在开发一个标牌解决方案(一个长时间运行的远程控制视频播放器),最近我遇到了一个非常类似的问题。由于我的崩溃非常罕见,而且我没有得到任何日志记录,因此我也决定采用"重新启动它"的方式来缓解问题。

但是,我的做法略有不同,因为我从嵌入在 xap 中的 silverlight 运行本机 (WPF) 附属应用程序。由于它是由 silverlight 播放器启动的,因此它可以在启动时获取进程 ID 作为参数。然后,它与 silverlight 播放器进行长时间的聊天(通过 http,端口也在启动时提供),如果 silverlight 合作伙伴突然静音,它会重新启动它。

重新启动是通过首先尝试关闭主窗口来完成的,如果在短暂的等待时间后不起作用,它就会被杀死。

由于卫星是 .NET,因此该逻辑不需要任何 P/Invoke。

如果你想纯粹在 Silverlight 中执行此操作,请查看互操作 wiki。

对于 kernel32 中的进程列表 GetConsoleProcessList.dll听起来很有希望。代码片段在WPF和Silverlight中同样有效。