WPF应用程序的入口点是什么?

61
Main方法是C#控制台应用程序的入口点。例如,如果我需要启动一些线程或服务,我将在Main方法中执行此操作。 我在WPF项目中没有看到Main方法,那么WPF应用程序的入口点是什么?如果我要启动一些线程或服务,在哪里编写启动它们的代码? 更新: 此答案概述了可用的解决方案,但每个解决方案的优缺点是什么?

这里讨论了相关的内容,替换WPF入口点的问题:https://dev59.com/sW025IYBdhLWcg3wNC51 - kenny
关于更新:答案提到了优点:越早越好。这与其他代码有关,关键在于什么时候更新。而且还有“太早”的说法。 - H H
5个回答

63

在使用Visual Studio的新项目向导生成的WPF独立应用程序中,应用程序的入口点是在App.g.cs(生成的代码)中定义的Main函数。在默认项目中,这是公共静态void App.Main方法。

Check this

通常情况下,.NET应用程序将使用任何具有public/static访问修饰符并且位于哪个类的Main方法作为其入口点(首次调用的函数)。

如果您的应用程序有多个带有public static Main方法的类,则需要在项目属性对话框中指定入口点。在“启动对象”下拉菜单中,选择包含应在启动时调用的Main方法的类。


2
但是,OP能否更新App.g.cs中的代码并将其用于自己的目的呢?从普通的App.xaml.cs中,我验证了“Main”方法无法被覆盖/重用。那么,这有什么意义呢? - Ron16
它说的是 App.g.i.cs,而不是 App.g.cs。 - Kyle Delaney
1
@Ron16:关键是仍然有一个Main--它的内容展示了如何启动WPF应用程序。虽然您无法自定义生成的入口点,但可以构建自己的入口点来执行相同的操作(可能在配置应用程序后)。 - cHao
点赞,因为解释了项目启动可以在项目属性中设置。当app.xaml.cs代码后台文件具有多个潜在的入口点时,这非常有用。 - J Weezy

59
您的主要入口点是App.Xaml的代码后台中OnStartup的重写:
public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        // here you take control
    }
}

其他值得注意的地方可能是Application.OnActivate()和你的MainWindow的Loaded和Initialized事件。

如果我需要启动一些线程或服务,应该在哪里编写启动它们的代码?

这取决于那些线程/服务需要和想要什么。


好的,线程可以在应用程序启动时立即启动,而服务应该在用户在UI上单击按钮时启动。在这种情况下,我认为线程可以在“OnStartup”方法中启动,而服务应该在UI准备就绪后启动。这个正确吗? - enzom83
1
我不知道/无法知道。这取决于他们做什么。需要 UI 的线程应该稍后启动。 - H H
1
为什么我们应该调用 base.OnStartup(e) - Altiano Gerung
为什么我在 Visual Studio 中使用 Ctrl-F 搜索时,Main() 函数没有出现?我已经选择了“整个解决方案”。 - InvalidBrainException
@AltianoGerung 这是一种良好的编程习惯。当我们在超类上重写一个方法时,通常我们只是想要一种方式来插入一个过程而不会干扰其流程。我们可能不知道该方法正在/将来可能对状态进行什么操作,因此最安全的方法是保留它。 - ne1410s

15

WPF应用程序的主要功能是自动生成的,可以在支持您的App.xaml文件的.cs文件之一中找到。您可以在解决方案资源管理器中展开App.xaml->App.xaml.cs->App->Main(),这会带您到App.g.i.cs源文件,其中包含您的Main()函数。

由于该文件是自动生成的,所以不建议在那里编辑Main,而是建议在项目中创建一个新的.cs文件以包含Main()函数。然后,您必须更改项目的属性以指定正确的启动对象。这是在项目属性中的“应用程序”选项卡上完成的。将其设置为包含自定义Main函数的类。

您可能想将自动生成的Main内容复制到新文件中,以便使应用程序正常运行(显示主窗口等)。


在解决方案资源管理器中,我在哪里可以找到 App.g.i.cs 文件? - Kyle Delaney
通常在 obj/Debug 文件夹中。如果您有任何类似的问题,可以在 Visual Studio 中打开文件(即使用此答案中提到的方法),并将鼠标悬停在文本编辑器中带有文件名称的选项卡上。 - Assimilater

3

入口点通常是App.xaml.cs。

最好避免在此处放置代码。相反,尝试在MVVM的视图模型中实例化它们。这通常是一个棘手的地方-正如你的问题所证明的那样。

另一种选择是在辅助类中加载它们,然后在app.xaml文件中实例化该类。


一个文件并不确定其中特定起始点的位置,它只是一个文件。 - Steve
除非有所更改,否则该文件将仅有一个方法,应该很明显。 - kidshaw
1
@kidshaw - 未经修改,它具有一个空类(0个方法)。 - H H
@henkholterman 真的吗?我检查的解决方案中有一个构造函数。一定是被另一个开发人员放在那里的。尽管如此,我仍然坚持我的答案,它确实存在,但有更明智的地方可以放置逻辑,就像你已经回答过的那样。 - kidshaw
1
这可能取决于框架版本。在VS 2013中它是空的。 - H H
我会检查一下,我正在运行2013.3版本——值得注意。感谢您的提示。 - kidshaw

1

你可以在App.xaml.cs文件中声明一个构造函数。

public partial class App : Application
{
    public App()
    {
        //initialize your app
    }
}

主函数在 App.g.i.cs 中声明,构建您的应用程序是发生的第一件事:

public static void Main() {
    MyWPF.App app = new MyWPF.App(); //calls your constructor
    app.InitializeComponent();
    app.Run();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接