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

如何阻止在WPF中自动生成Main?,wpf,Wpf,我正在尝试使用以下提示创建一个单实例WPF应用程序: 这最终需要对Main()进行更改。在WPF中,Main()似乎是自动生成的。我不想修改自动生成的代码。有没有办法禁止自动生成Main (或者,如果您知道一种更好的WPF单应用实例模式,它不依赖于修改自动生成的代码,请推荐)我不知道这是否是您的问题,但我在启动时创建了互斥锁。我不碰水管 重要的是,在App.XAML的XAML Declarion中删除StartupUri。这会阻止运行时自动打开指定的资源。实际上,在默认的WPF项目中,应用程序

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

这最终需要对Main()进行更改。在WPF中,Main()似乎是自动生成的。我不想修改自动生成的代码。有没有办法禁止自动生成Main


(或者,如果您知道一种更好的WPF单应用实例模式,它不依赖于修改自动生成的代码,请推荐)

我不知道这是否是您的问题,但我在启动时创建了互斥锁。我不碰水管


重要的是,在App.XAML的XAML Declarion中删除StartupUri。这会阻止运行时自动打开指定的资源。

实际上,在默认的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();
    }
}

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

我不会使用互斥方法来创建单实例WPF应用程序。我会使用这里描述的答案-

这也是博客中的。

中描述的方法:

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

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

  • 在解决方案资源管理器中关闭App.g.cs的static Main()方法的自动生成,右键单击App.xaml,选择“属性”,然后将“构建操作”从“ApplicationDefinition”更改为“Page”


  • 这是一个有趣的方法。在调用base.OnStartup(e)之前,是否需要检查是否可以获取互斥体?这在项目文件中的何处?找到了。。。它被设置为(未设置),我猜默认为应用程序类?在应用程序选项卡(C#),启动对象上。是的,WPF项目的默认值是应用程序类。@LemonBeagle在应用程序类中使用OnStartup事件处理程序表示WPF应用程序启动代码已在运行。许多答案都是将代码放入事件处理程序,然后杀死应用程序,而不是像我建议的那样在应用程序实例化之前进行检查。我更喜欢更干净的结构化方法。Yikes-这依赖于VB程序集??是的,这不是一个大问题,只是需要在应用程序中部署一个额外的依赖项。不要被
    Microsoft.VisualBasic
    所迷惑。这不是VB运行时的一部分,而是.net运行时的一部分。看,我会花更多的时间在代码评审中解释它的包含,而不是它的价值。不过我还是很感激你的建议
    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();
        }
    }