應用程式的入口函數是main函數,在Console程式和Winform程式main函數都有清晰的定義,可以很容易找到,但是WPF的工程文件中卻找不到main函數的定義,是WPF不需要main函數嗎?NO! NO! NO! 不要太天真了,WPF是有main函數的,VS幫我們自動生成了,在obj\Deb ...
應用程式的入口函數是main函數,在Console程式和Winform程式main函數都有清晰的定義,可以很容易找到,但是WPF的工程文件中卻找不到main函數的定義,是WPF不需要main函數嗎?NO! NO! NO! 不要太天真了,WPF是有main函數的,VS幫我們自動生成了,在obj\Debug\App.g.cs文件中可以看到以下的定義(obj\Debug文件夾下還有一個叫App.g.i.cs的文件,文件內容與App.g.cs一致,這個文件也是自動生成的,是為了VS的intelligence 智能感知服務的,關於intelligence 以後再講)。
可以看到Main函數在App類中定義,App類由VS自動生成,該類繼承自System.Windows.Application,Application類維護了應用程式的生命周期,每個運行中的WPF程式都由Application的一個實例表示。以上代碼中關鍵的兩句是:
this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
app.Run();
這兩句的作用是啟動應用程式,並將"MainWindow.xaml"定義的視窗作為該應用程式的主視窗。自動生成的代碼比較簡單,Application類可以做的事情遠不止這些,以後可以詳細講一下。
以上是自動生成的Main函數,也可以手動創建我們自己的Main函數,如下:
public class StartUp
{
[STAThread]
public static void Main(string[] args)
{
var app = new App
{
StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative)
};
app.Run();
}
}
但是你會得到如下的編譯錯誤:
error CS0017: Program has more than one entry point defined. Compile with /main to specify the type that contains the entry point.
原因也很簡單,VS幫你生成了一個Main函數,你又自己定義了一個Main函數,但是應用程式只能有一個入口,系統不知道要用哪一個了,所以需要手動指定一個。在工程的屬性的Application頁中,設置Startup object為我們剛剛定義的類StartUp就可以了。