31

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

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

4

3 回答 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. 已编译是在 Visual Studio(在 MSBuild 中)中标记为“页面”的 XAML 文件,部署为 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 更有优势。

于 2009-09-14T20:31:57.533 回答
15

Xaml 与 C# 代码是分开的,因为它允许对这些元素进行“软编码”。如果你将 Xaml 编译成 C# 代码,你就破坏了这个特性,因为现在 UI 元素、数据绑定、事件等现在都被硬编码到程序中,你需要重新编译整个程序来做一个小的改动用户界面。

petr k 的博客文章。参考资料说 Xaml 实际上是一次编译为 IL,但现在使用 Baml 是因为:

  1. 它更安全(不能直接执行),并且
  2. Baml 可以本地化(不同的语言)而不需要重新编译。
于 2009-09-14T20:31:47.273 回答
0

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

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

它是 Visual Studio 2010 的插件,可让您将 XAML 编译为等效的 C#,了解如何将 XAML 编译为 C# 真的很有趣。

于 2014-09-15T22:17:57.217 回答