我正在尝试使用以下提示创建单个实例WPF应用程序:
What is the correct way to create a single-instance application?
这最终需要更改Main()。在WPF中,Main()似乎是自动生成的。我宁愿不修改自动生成的代码。有没有办法抑制Main被自动生成?
(或者,如果您知道WPF的单个应用程序实例模式更好,不依赖于修改自动生成的代码,请建议)
答案 0 :(得分:8)
来自博客:http://bengribaudo.com/blog/2010/08/26/136/wpf-where-is-your-static-main-method
以下两种方法将避免重复的主要碰撞:
告诉编译器您的静态Main()方法应该是执行入口点 - 将项目的“Startup object”设置设置为包含静态Main()方法的类(在Solution中右键单击项目)在资源管理器中,选择“属性”,然后在“应用程序”选项卡下查找“启动对象”设置。 (这也是 Bahri Gungor 提到的)
关闭自动生成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。这可以防止运行时自动打开指定的资源。