如何阻止Main在WPF中自动生成?

时间:2012-02-29 18:54:23

标签: wpf

我正在尝试使用以下提示创建单个实例WPF应用程序:

What is the correct way to create a single-instance application?

这最终需要更改Main()。在WPF中,Main()似乎是自动生成的。我宁愿不修改自动生成的代码。有没有办法抑制Main被自动生成?

(或者,如果您知道WPF的单个应用程序实例模式更好,不依赖于修改自动生成的代码,请建议)

4 个答案:

答案 0 :(得分:8)

来自博客:http://bengribaudo.com/blog/2010/08/26/136/wpf-where-is-your-static-main-method

以下两种方法将避免重复的主要碰撞:

  1. 告诉编译器您的静态Main()方法应该是执行入口点 - 将项目的“Startup object”设置设置为包含静态Main()方法的类(在Solution中右键单击项目)在资源管理器中,选择“属性”,然后在“应用程序”选项卡下查找“启动对象”设置。 (这也是 Bahri Gungor 提到的)

  2. 关闭自动生成App.g.cs的静态Main()方法 - 在解决方案资源管理器中,右键单击App.xaml,选择“属性”,然后从“ApplicationDefinition”更改“Build Action”到“页面”。

答案 1 :(得分:4)

实际上,在默认 WPF项目中,应用程序启动对象是App类(app.xaml的代码隐藏)。

您可以编写自己的类,根据需要创建启动代码,然后像这样启动应用程序:

public class Startup
{
    [STAThread]
    public static void Main(string[] args)
    {
        // Check for existing instance (mutex or w/e) here

        //
        App app = new App();
        app.Run();
    }
}

您可以更改项目文件中的启动对象。

答案 2 :(得分:1)

我不会使用互斥方法来创建单个实例WPF应用程序。我会用这里描述的答案 - https://stackoverflow.com/a/19326/248164

这也是Pro WPF in C# 2010中描述的方法。

答案 3 :(得分:0)

我不知道这是你的问题,但是我在OnStartup中创建了互斥锁。我不碰Main()。

protected override void OnStartup(StartupEventArgs e) {            
        base.OnStartup(e);            
        m_singleInstanceMutex = new Mutex(false, SINGLE_INSTANCE_MUTEX_ID);
        ...

重要的是,您在App.xaml的XAML-Declarion中删除了StartupUri。这可以防止运行时自动打开指定的资源。