为什么XAML被编译成BAML而不是C#

时间:2009-09-14 20:26:47

标签: wpf xaml baml

据我所知,XAML中完成的所有操作都可以在C#中完成。

为什么XAML是在BAML中编译而不是在C#中编译的?在编译时解析XAML并创建相应的C#代码会不会更有效吗?

3 个答案:

答案 0 :(得分:21)

此博客文章应提供全面的答案:http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/05/25/Compiled-XAML-3D00-BAML-not-IL.aspx

  

昨天我讲了XAML并提出了以下问题:为什么XAML被编译成BAML而不是直接编入IL以获得更好的性能?

     

在给出正确答案之前,我想解释一下BAML是什么。

     

实际上有两种处理XAML文件的方法:Loose或Compiled。

     
      
  1. 应该在运行时解析松散的XAML文件,并且可以将其部署为简单的XML文件,本地,远程或嵌入到程序集中。
  2.   
  3. Compiled是在Visual Studio中标记为“页面”的XAML文件(在MSBuild中),部署为BAML(二进制应用程序标记语言)文件并作为程序集资源嵌入。
  4.         

    松散的XAML文件不能包含 x:Class XAML关键字,也不能嵌入源代码,也不能通过各种方式发出代码。可以通过调用XamlReader.Load()方法加载松散的XAML文件,将返回值强制转换为根元素。松散的XAML版本提供了一种动态的方式来加载和更改视图,但由于XML文件在运行时被解析,因此性能很差。

         

    编译的XAML文件(BAML)可以通过使用 x:Class 或通过注册事件来发出代码。可以通过调用 Application.LoadComponent()从BAML内部加载元素,并将返回值强制转换为根元素。已编译的XAML版本提供了更好的性能,因为它是XAML文件的预标记化二进制版本,因此它更小并且可以更快地加载,但它不是动态的。

         

    曾几何时,有CAML。 CAML是已编译的XAML文件的确切IL版本。不幸的是,WPF团队决定将其删除,并保留BAML版本,原因如下:

         
        
    1. BAML紧凑,因此可以更快地下载(适用于XBAP应用程序)
    2.   
    3. BAML的安全威胁低于代码执行(适用于XBAP应用程序)
    4.   
    5. BAML可以在编译后进行本地化
    6.         

      在底线中,BAML比IL慢 ,但比CAML更具优势。

答案 1 :(得分:12)

Xaml与c#代码分开,因为它允许这些元素被“软编码”。如果您将Xaml编译为C#代码,则会破坏此特性,因为现在UI元素,数据绑定,事件等现在已经硬编码到程序中,并且您需要重新编译整个程序以对其进行微小更改用户界面。

博客文章即petr k。引用说Xaml实际上是一次编译成IL,但现在使用Baml是因为:

  1. 更安全(无法直接执行)和
  2. Baml可以本地化(不同语言),无需重新编译。

答案 2 :(得分:0)

理论上,所有XAML都可以编译为等效的C#(尽管BAML在实践中使用)。

http://xamlgenerator.codeplex.com/查看生成器后面的XAML代码。

它是Visual Studio 2010的一个插件,允许您将XAML编译为等效的C#,这对于了解如何将XAML编译为C#非常有趣。