Почему XAML компилируется в BAML, а не в C # - PullRequest
27 голосов
/ 15 сентября 2009

Насколько я знаю, все, что делается в XAML, может быть сделано в C #.

Почему XAML компилируется в BAML, а не в C #? Не было бы более эффективно проанализировать XAML во время компиляции и создать соответствующий код C #?

Ответы [ 3 ]

21 голосов
/ 15 сентября 2009

Этот пост должен содержать исчерпывающий ответ: 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, помеченный как «Страница» в Visual Studio (в MSBuild), развернутый как файл BAML (язык разметки двоичных приложений) и внедренный как ресурс сборки.

Свободный файл XAML не может содержать ключевое слово x: Class XAML, также он не может встраивать исходный код и не может генерировать код всеми средствами. Можно загрузить свободный XAML-файл, вызвав метод XamlReader.Load (), приведя возвращаемое значение в корневой элемент. Свободная версия XAML обеспечивает динамический способ загрузки и изменения представления, но обеспечивает низкую производительность из-за того, что файл XML анализируется во время выполнения.

Скомпилированный файл XAML (BAML) может генерировать код, используя x: Class или, например, путем регистрации событий. Можно загрузить элемент изнутри BAML, вызвав Application.LoadComponent () , приведя возвращаемое значение к корневому элементу. Скомпилированная версия XAML обеспечивает лучшую производительность, поскольку представляет собой двоичную версию файла XAML с предварительной маркировкой, следовательно, она меньше и может загружаться быстрее, но она не динамическая.

Когда-то был CAML. CAML была точной версией IL скомпилированного файла XAML. К сожалению, команда WPF решила устранить ее и сохранить версию BAML по следующим причинам:

  1. BAML компактен, поэтому его можно загружать быстрее (хорошо для приложений XBAP)
  2. BAML представляет меньшую угрозу безопасности, чем выполнение кода (хорошо для приложений XBAP)
  3. BAML может быть локализован после компиляции

В итоге BAML на немного медленнее, чем IL, но имеет больше преимуществ, чем CAML.

12 голосов
/ 15 сентября 2009

Xaml отделен от кода c #, поскольку он позволяет «мягко кодировать» эти элементы. Если вы компилируете код с Xaml в C #, вы побеждаете эту характеристику, потому что теперь элементы программы, привязка данных, события и т. Д. Теперь жестко запрограммированы в программе, и вам необходимо перекомпилировать всю программу, чтобы внести незначительные изменения в пользовательский интерфейс.

Сообщение в блоге, которое petr k. Ссылки говорят, что Xaml фактически был скомпилирован в IL когда-то, но теперь используется Baml, потому что:

  1. Это более безопасно (его нельзя выполнить напрямую), а
  2. Baml может быть локализован (на разных языках) без перекомпиляции.
0 голосов
/ 16 сентября 2014

Теоретически, все XAML могут быть скомпилированы в эквивалентный C # (хотя BAML используется на практике).

Проверьте код XAML позади генератора на http://xamlgenerator.codeplex.com/.

Это плагин для Visual Studio 2010, позволяющий компилировать XAML в эквивалентный C #, действительно интересно узнать, как XAML компилируется в C #.

...