31

私の知る限り、XAML で行うことはすべて C# で行うことができます。

XAML が C# ではなく BAML でコンパイルされるのはなぜですか? コンパイル時に 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 は直接 IL ではなく BAML にコンパイルされるのですか?

正解を述べる前に、BAML とは何かを説明したいと思います。

XAML ファイルを処理するには、実際には次の 2 つの方法があります。Loose または Compiled です。

  1. Loose XAML ファイルは実行時に解析する必要があり、単純な XML ファイルとしてローカル、リモート、またはアセンブリに埋め込むことができます。
  2. コンパイル済みは、Visual Studio (MSBuild 内) で「ページ」としてマークされた XAML ファイルであり、BAML (バイナリ アプリケーション マークアップ言語) ファイルとして展開され、アセンブリ リソースとして埋め込まれます。

Loose XAML ファイルにはx:Class XAML キーワードを含めることはできず、ソース コードを埋め込むことも、コードを出力することもできません。XamlReader.Load() メソッドを呼び出し、戻り値をルート要素にキャストすることで、ルーズ XAML ファイルを読み込むことができます。Loose 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 コード ビハインド ジェネレーターを確認してください。

XAML を同等の C# にコンパイルできるようにする Visual Studio 2010 用のプラグインです。

于 2014-09-15T22:17:57.217 に答える