I am very beginner when it comes to programming but I was sure that one of the universal rules was that an program starts with Main(). I do not see one when I create a WPF project. Is Main() simply named something differently in WPF?
Main()
is generated during compilation. You can find it in App.g.cs
(in obj/{Debug,Release}
folder).
It is generated during build, but you can provide your own (disambiguating it in project-properties as necessary). Look in obj/debug for an app file; I have (courtesy of "C# 2010 Express") App.g.i.cs
with:
namespace WpfApplication1 {
/// <summary>
/// App
/// </summary>
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public partial class App : System.Windows.Application {
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void InitializeComponent() {
#line 4 "..\..\..\App.xaml"
this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
#line default
#line hidden
}
/// <summary>
/// Application Entry Point.
/// </summary>
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public static void Main() {
WpfApplication1.App app = new WpfApplication1.App();
app.InitializeComponent();
app.Run();
}
}
}
main()
is a standard entry point for an application, but all applications are structured that way. In a XAML project, the App.XAML file specifies the entry point where it says StartupUri="MainWindow.xaml"
.
As it is stated by others, the actual main function is generated based on the contents of the XAML files in the project.
Main()
is automatically provided by the CLR and the WPF.
The C# compiler takes a command-line switch /m
which specifies the type that contains the implementation of Main()
. By convention, if no startup object is explicitly specified, the CLR will lookup any class that has a static Main()
method and will call it. (As @Marc Gravel pointed out in his comment)
In the case of WPF, the Main()
is automatically generated when App.xaml
is built and the /m switch is specified to make the C# compiler use that class as entry point. If you look at the project properties however, you'll find there's a setting for you to choose the startup object. So if you want, you can provide your own class that implements Main()
.
Note that this will put the responsibility on you to create the Application
instance and call its Run()
method to ensure that the WPF infrastructure is started properly.