Вчера я читал лекцию о XAML, и мне был задан следующий вопрос: почему XAML компилируется в BAML, а не напрямую в IL для лучшей производительности?
Прежде чем дать правильный ответ, я хочу объяснить, что такое BAML.
Существует два способа обработки файла XAML: свободный или скомпилированный.
- Свободный XAML-файл должен анализироваться во время выполнения и может быть развернут как простой XML-файл, локально, удаленно или встроен в сборку.
- Скомпилированный - это файл 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 по следующим причинам:
- BAML компактен, поэтому его можно загружать быстрее (хорошо для приложений XBAP)
- BAML представляет меньшую угрозу безопасности, чем выполнение кода (хорошо для приложений XBAP)
- BAML может быть локализован после компиляции
В итоге BAML на немного медленнее, чем IL, но имеет больше преимуществ, чем CAML.