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

jap*_*apf 27 wpf xaml baml

据我所知,在XAML中完成的所有事情都可以在C#中完成.

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

pet*_* k. 23

这篇博文应该提供一个全面的答案: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. Compiled是在Visual Studio中标记为"页面"的XAML文件(在MSBuild中),部署为BAML(二进制应用程序标记语言)文件并作为程序集资源嵌入.

松散的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. BAML的安全威胁低于代码执行(适用于XBAP应用程序)
  3. 编译后可以对BAML进行本地化

在底线,BAML是一个比IL慢,但具有比CAML更多的优势.

  • 您应该将相关信息复制到您的答案中.就目前而言,你的答案本身并没有回答任何问题. (6认同)
  • 现在,由于 BAML 非常接近 XAML 并且不再生成 IL,那么创建的 *.g.cs 文件是什么? (2认同)

Rob*_*vey 12

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

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

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