Why XAML is compiled into BAML and not in C#
NickName:japf Ask DateTime:2009-09-15T04:26:47

Why XAML is compiled into BAML and not in C#

As far as I know, everything done in XAML can be done in C#.

Why XAML is compiled in BAML and not in C# ? Wouldn't be more efficient to parse the XAML at compile-time and create the corresponding C# code ?

Copyright Notice:Content Author:「japf」,Reproduced under the CC 4.0 BY-SA copyright license with a link to the original source and this disclaimer.
Link to original article:https://stackoverflow.com/questions/1423728/why-xaml-is-compiled-into-baml-and-not-in-c-sharp

Answers
Robert Harvey 2009-09-14T20:31:47

The Xaml is separate from the C# code because it allows these elements to be \"soft-coded.\" If you compile the Xaml to C# code, you defeat this characteristic, because now the UI elements, data binding, eventing, etc. are now hard-coded into the program, and you need to recompile the entire program to make a minor change to the user interface.\n\nThe blog post that petr k. references says that Xaml actually was compiled to IL at one time, but Baml is now used because:\n\n\nIt is more secure (it cannot be executed directly), and \nBaml can be localized (different languages) without requiring recompilation.\n",


petr k. 2009-09-14T20:31:57

This blog post should provide a comprehensive answer: http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/05/25/Compiled-XAML-3D00-BAML-not-IL.aspx\n\n\n Yesterday I lectured about XAML and the following question was asked: Why XAML is compiled into BAML and not directly into IL for better performance?\n \n Before giving the correct answer, I want to explain what BAML is.\n \n There are actually two ways for handling a XAML file: Loose or Compiled.\n \n \n Loose XAML file should be parsed at runtime, and can be deployed as a simple XML file, locally, remotely or embedded into the assembly.\n Compiled is a XAML file marked as “Page” in Visual Studio ( in MSBuild), deployed as a BAML (Binary Application Markup Language) file and embedded as an assembly resource.\n \n \n A loose XAML file can’t include the x:Class XAML keyword, also it can’t embed a source code, nor it can emit code by all means. It is possible to load a loose XAML file by calling XamlReader.Load() method, casting the return value into the root element. The loose XAML version provides a dynamic way to load and change the view, but provides poor performance due to the fact that the XML file is parsed at runtime.\n \n A compiled XAML file (BAML) can emit code, by using x:Class, or by registering events for example. It is possible to load an element from inside the BAML by calling the Application.LoadComponent(), casting the return value into the root element. The compiled XAML version provides better performance since it is pre-tokenized binary version of the XAML file, hence it is smaller and can be loaded faster, but it is not dynamic.\n \n Once upon a time, there was CAML. CAML was the exact IL version of the compiled XAML file. Unfortunately, the WPF team has decided to eliminate it, and keep the BAML version for the following reasons:\n \n \n BAML is compact hence it can be downloaded faster (good for XBAP applications)\n BAML is less security threat than code execution (good for XBAP applications)\n BAML can be localized after compilation\n \n \n In the bottom line, BAML is a little slower than IL but has more advantages than CAML.\n",


More about “Why XAML is compiled into BAML and not in C#” related questions