WPF 单实例应用程序






4.93/5 (47投票s)
如何强制您的 WPF 应用程序只有一个实例
问题
这篇文章要解决的问题是如何强制您的 WPF 应用程序只有一个实例?
解决方案源码
该解决方案基于微软即将 (?) 发布的一些 WPF 参考应用程序中的代码。我没有编写它,但我多次使用它,并且它是迄今为止我发现的最佳解决方案,所以我不想看到它未发布。
解决方案优势
那么,这个解决方案有什么优势呢?毕竟,这并不是第一次有人发布这个问题的解决方案。
嗯,最重要的优势是它有效。
没有故障。没有特殊情况。没有固有的竞争条件。
它就是有效。
其次,它很容易使用。在下一节中,我将向您展示如何使用它。
第三,您的 WPF 应用程序没有任何约束。具体来说,您的主应用程序/窗口类不必继承一些基类才能使其工作。
最后,您不需要依赖任何 VB DLL。
我说这个是因为这个问题的流行解决方案之一要求您添加对(与 WinForms 相关!)Visual Basic DLL 的引用,这对于某些人来说可能感觉很奇怪。
作为奖励,该解决方案在运行时将第二个实例的参数提供给第一个实例。如果您想将您的应用程序与 Windows 7 任务栏集成,这将非常有用。
解决方案详情
所以,让我们看看如何让你的 WPF 应用程序只有一个实例。
步骤 1:将文件 SingleInstance.cs 添加到您的项目。
步骤 2:向您的项目添加引用:System.Runtime.Remoting
。
步骤 3:让您的应用程序类实现 ISingleInstanceApp
(在 SingleInstance.cs 中定义)。
此接口中唯一的方法是
bool SignalExternalCommandLineArgs(IList<string> args)
当您的应用程序的第二个实例尝试运行时,将调用此方法。它有一个 args 参数,它与传递给第二个实例的命令行参数相同。
步骤 4:定义您自己的 Main
函数,该函数使用单实例类。
您的 App 类现在应该类似于这样
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application, ISingleInstanceApp
{
private const string Unique = "My_Unique_Application_String";
[STAThread]
public static void Main()
{
if (SingleInstance<App>.InitializeAsFirstInstance(Unique))
{
var application = new App();
application.InitializeComponent();
application.Run();
// Allow single instance code to perform cleanup operations
SingleInstance<App>.Cleanup();
}
}
#region ISingleInstanceApp Members
public bool SignalExternalCommandLineArgs(IList<string> args)
{
// handle command line arguments of second instance
// ...
return true;
}
#endregion
}
步骤 5:设置新的主入口点。
选择项目属性 –> 应用程序,并将“启动对象”设置为您的 App 类名称,而不是“(未设置)”。
步骤 6:取消默认的 WPF 主函数。
右键单击 App.xaml,属性,将“生成操作”设置为“页面”而不是“应用程序定义”。
解决方案内部工作原理
我可以将其总结为:互斥锁和远程处理,做得很好。
如果您想了解更多详情,请查看代码。
您可以在这里找到 WPF 示例应用程序。
暂时就到这里,
Arik Poznanski。