2014-01-25 42 views
9

我想了解XAML文件的編譯過程。對不起,在這裏提出這個問題,但我真的沒有找到任何資源解釋這個過程的深入。編譯XAML文件(WPF)

據我所知,XAML被編譯成一個.baml文件。但是:.baml是從生成的.g.cs文件編譯的嗎?或者.baml是獨立的,是從生成的.g.cs和原始的.xaml.cs文件生成的IL代碼 - 這可以解釋爲什麼MainWindow是部分的。 XAML聲明的哪些部分進入BAML文件? 我也想知道什麼時候加載一個.baml文件(例如,當談論一個窗口時)。 感謝您的幫助。

+0

問題的標題真的不清楚。它沒有明確說明目的。 –

回答

8

在我基於下面的參考的理解中,在XAML中聲明的所有內容都被編譯爲BAML;編譯爲IL的.g.cs.xaml.cs文件; .xaml.cs IL從.xaml.cs文件(顯然)和g.cs代碼生成IL包含代碼生成與BAML交互(而不是從BAML生成的IL代碼它自我)。

請檢查此blog post作爲參考。總之,筆者說,XAML的編譯2個步驟發生了:

步驟1。第一步是使用xamlc.exe編譯器將XAML文件編譯爲BAML。例如,如果我們的項目包含文件名Window1.xaml,編譯器將創建一個名爲Window1.baml的臨時文件,並將其放置在obj \ Debug子文件夾中(位於我們的項目文件夾中)。同時,使用我們選擇的語言爲我們的窗口創建一個部分類。例如,如果我們使用C#,編譯器將在obj \ Debug文件夾中創建一個名爲Window1.g.cs的文件。 g代表生成的。

部分類包括三件事:

•我們窗口中所有控件的字段。

•從程序集加載BAML的代碼,從而創建對象樹。當構造函數調用Initialize Component()時會發生這種情況。

•將適當的控制對象分配給每個字段並連接所有事件處理程序的代碼。這發生在一個名爲Connect()的方法中,BAML解析器在每次找到一個命名對象時調用它。

步驟2。當XAML到BAML編譯階段完成時,Visual Studio使用適當的語言編譯器來編譯我們的代碼和生成的部分類文件。在C#應用程序的情況下,它是處理此任務的csc.exe編譯器。編譯後的代碼變成一個單獨的程序集Window1.exe),每個窗口的BAML作爲單獨的資源嵌入。

+0

可以將wpf xaml編譯爲xbf嗎? – lindexi