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

30

据我所知,XAML 中的所有操作都可以用 C# 实现。

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

3个回答

26

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

昨天我讲解了XAML,接下来有一个问题:为什么XAML要编译成BAML而不是直接编译成IL以获得更好的性能呢?

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

处理XAML文件有两种方法:松散或编译过的。

  1. 松散的XAML文件应在运行时解析,并可作为简单的XML文件本地、远程或嵌入到程序集中部署。
  2. 已编译的XAML文件标记为“Page”(在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具有更多优势。


8
请您将相关信息复制到您的回答中。目前的答案无法单独回答任何问题。 - Zack
2
现在,由于BAML与XAML相当接近且不再生成IL,那么*.g.cs文件是用来做什么的? - Paul
如果我在这里读懂了,那么BAML在长期死亡的Silverlight世界中可能比编译的IL更具优势,但在现代的WPF/UWP/MAUI世界中并不是那么重要。@paul,g.cs文件有特定的目的,即在您使用x:Name属性时为您的代码后台生成私有成员。否则,您的代码后台将无法编译。请注意,ResourceDictionary没有代码后台,因此不会生成g.cs文件。 - Emperor Eto
一个松散的XAML文件不能包含x:Class XAML关键字。这是因为x:Class关键字用于指定XAML文件的代码后端类。当XAML文件是松散的时候,它不会与任何特定的代码后端类关联,因此无法使用x:Class关键字。 - undefined

14

Xaml与C#代码分离是为了让这些元素可以进行“软编码”。如果将Xaml编译为C#代码,就会破坏这个特性,因为现在UI元素、数据绑定、事件等都已经硬编码到程序中,如果要对用户界面进行微小的更改,就需要重新编译整个程序。

Petr k. 引用的博客文章指出,Xaml曾经被编译成IL,但现在使用Baml是因为:

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

0

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

请查看http://xamlgenerator.codeplex.com/上的XAML Code Behind Generator。

这是Visual Studio 2010的一个插件,允许您将XAML编译成等效的C#代码,非常有趣,可以让您了解XAML如何被编译成C#。


2
这不像是问题的答案。 - Aditya Bokade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接