65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 单实例应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (47投票s)

2010 年 5 月 28 日

Ms-PL

2分钟阅读

viewsIcon

149904

如何强制您的 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。

kick it on DotNetKicks.com Shout it
© . All rights reserved.