既定の XAML スキーマ コンテキストと WPF XAML スキーマ コンテキスト
XAML スキーマ コンテキストは、特定の XAML ボキャブラリを使用する XAML の運用環境と、オブジェクト書き込み動作が対話する方法を修飾する、概念的なエンティティです。これには、型マッピングの解決方法、アセンブリの読み込み方法、特定のリーダーとライターの設定の解釈方法などが含まれます。 このトピックでは、.NET XAML サービスと、関連付けられた既定の XAML スキーマ コンテキストの、CLR 型システムに基づく機能について説明します。 このトピックでは、WPF に使用される XAML スキーマ コンテキストについても説明します。
既定の XAML スキーマ コンテキスト
.NET XAML サービスでは、既定の XAML スキーマ コンテキストの実装と使用の両方が行われています。 既定の XAML スキーマ コンテキストの動作は、XamlSchemaContext クラスの API において常に完全に認識されるとは限りません。 ただし、多くの場合、既定の XAML スキーマ コンテキストによって影響を受ける動作は、XAML 型システムの一般的な API ( XamlMember や XamlType のメンバーなど) を通して、または XAML リーダーおよび XAML ライターで公開されている、既定の XAML スキーマ コンテキストを使用する API を通して、観察することができます。
XamlSchemaContext コンストラクターを呼び出すことにより、既定の動作をカプセル化する XamlSchemaContext を作成できます。 これにより、既定の XAML スキーマ コンテキストが明示的に作成されます。 XamlSchemaContext 入力パラメーターを明示的に受け取らない API を使用して XAML リーダーまたは XAML ライターを初期化すると、同じ既定の XAML スキーマ コンテキストが暗黙的に作成されます。
既定の XAML スキーマ コンテキストは、その型マッピング動作を CLR リフレクションに依存しています。 これには、CLR の定義している Type および関連する PropertyInfo または MethodInfo を調べることが含まれます。 また、CLR バッキング型を使用する XAML 型または XAML メンバーの情報の詳細を入力するには、型またはメンバーの CLR 属性が使用されます。 必要な情報は CLR 型システムから取得できるため、既定の XAML スキーマ コンテキストに Invoker
パターンなどの型システム拡張手法は必要ありません。
アセンブリ読み込みロジックの場合、既定の XAML スキーマ コンテキストは、XAML 名前空間マッピングで提供されるアセンブリ値に主に依存します。 また、内部型の読み込みなどのシナリオでは、LocalAssembly でアセンブリに読み込むを示唆することができます。
WPF XAML スキーマ コンテキスト
WPF XAML スキーマ コンテキストについてこのトピックで説明するのは、WPF の実装を使用することで、既定以外の XAML スキーマ コンテキストを実装することによって導入できる機能の種類がわかりやすく示されるためです。 また、WPF XAML に関する WPF のドキュメントでは、XAML スキーマ コンテキストの概念があまり詳しく説明されていません。XAML スキーマ コンテキストによって有効になる動作は、既定の XAML スキーマ コンテキストの動作についての説明と合わせて示した場合にのみ、完全に理解できる可能性があります。 WPF XAML スキーマ コンテキストによって実装される動作は、次のとおりです。
参照の上書き: WPF に含まれる XAML 用のいくつかのコンテンツ モデルには、ContentPropertyAttribute で属性にしなくても機能する XAML コンテンツ プロパティがあります。 WPF 用の LookupContentProperty のオーバーライドにより、この動作が実装されます。
WPF 式の遅延: WPF のいくつかの式クラスを使用すると、ランタイム コンテキストが使用可能になるまで値が遅延されます。 また、テンプレートの拡張は、遅延手法に依存するランタイム動作です。
型システム参照の最適化: WPF には、広範な XAML ボキャブラリとオブジェクト モデルがあり、これには文字どおり数百の WPF 定義クラスに継承される基底クラスのメンバー定義が含まれます。 また、WPF 自体が複数のアセンブリに及んでいます。 WPF では、参照テーブルやその他の手法を使用して、その型参照が最適化されます。 これにより、既定の XAML スキーマ コンテキストと CLR ベースの型参照より、パフォーマンスが向上します。 参照テーブルに型が存在しない場合は、既定の XAML スキーマ コンテキストに似た XAML スキーマ コンテキストの手法が動作で使用されます。
XamlType および XamlMember 拡張: WPF においては、プロパティの概念は依存関係プロパティにより、イベントの概念はルーティング イベントにより、それぞれ拡張されます。 これらの概念で XAML の処理操作をいっそうよく把握できるよう、WPF により XamlType と XamlMember が拡張され、依存関係プロパティとルーティング イベントの特性を報告する内部プロパティが追加されています。
WPF XAML スキーマ コンテキストへのアクセス
WPF の System.Windows.Markup.XamlReader または System.Windows.Markup.XamlWriter に基づく XAML 手法を使用している場合、WPF XAML スキーマ コンテキストは、これらの XAML リーダーおよび XAML ライターの実装で既に使用されています。
WPF XAML スキーマ コンテキストを使用して初期化されない他の XAML リーダーまたは XAML ライターの実装を使用している場合は、XamlReader.GetWpfSchemaContext から動作する WPF XAML スキーマ コンテキストを取得できることがあります。 その後、XamlSchemaContext を使用する他の API の初期化で、この値を使用できます。 たとえば、初期化のために XamlXmlReader を呼び出し、WPF XAML スキーマ コンテキストを渡すことができます。 または、XAML 型システムの操作のために WPF XAML スキーマ コンテキストを使用することもできます。 これには、XamlType または XamlMember の構築の初期化、または XamlSchemaContext.GetXamlType の呼び出しが含まれる場合があります。
純粋な XAML ノード ストリームの観点から WPF XAML の特定の要素にアクセスする場合、WPF フレームワークの一部の機能はまだ動作していない可能性があることに注意してください。 たとえば、コントロールの WPF テンプレートはまだ適用されていません。 したがって、実行時に完全なビジュアル ツリーが設定されるプロパティにアクセスする場合、テンプレートを参照するプロパティ値のみが表示されることがあります。 WPF マークアップ拡張に対して提供されるサービス コンテキストは、実行時以外の状況から提供される場合は正確でない可能性もあり、オブジェクト グラフを書き込もうとすると例外が発生する場合があります。
XAML とアセンブリの読み込み
XAML および .NET XAML サービスのアセンブリの読み込みは、CLR で定義されている AppDomain の概念と統合されます。 アセンブリの読み込み方法または型の検索方法は、XAML スキーマ コンテキストにより、実行時またはデザイン時に、AppDomain と他の要素の使用に基づいて解釈されます。 このロジックは、XAML が XAML リーダー用の Loose XAML か、XamlBuildTask
によって DLL にコンパイルされる XAML か、または WPF の PresentationBuildTask
によって生成される BAML かにより、少しずつ異なります。
WPF の XAML スキーマ コンテキストは WPF のアプリケーション モデルと統合され、そこでは、AppDomain と共に WPF の実装の詳細である他の要素が使用されます。
XAML リーダーの入力 (Loose XAML)
XAML スキーマ コンテキストにより、最後に読み込まれたアセンブリから始めて、アプリケーションの AppDomain が反復処理され、既に読み込まれているアセンブリから、名前のすべての部分が一致するものが検索されます。 一致するアセンブリが見つかった場合、それが解決に使用されます。
それ以外の場合は、CLR の Assembly API に基づく次の方法のいずれかが、アセンブリの読み込みに使用されます。
名前がマッピングで修飾されている場合は、修飾された名前で Assembly.Load(String) を呼び出します。
前のステップが失敗した場合は、短い名前 (および、存在する場合は公開キー トークン) を使用して Assembly.Load(String) を呼び出します。
マッピングで名前が修飾されていない場合は、Assembly.LoadWithPartialName を呼び出します。
XamlBuildTask
XamlBuildTask
は、Windows Communication Foundation (WCF) と Windows Workflow Foundation に使用されます。
XamlBuildTask
によるアセンブリ参照は、常に完全修飾されていることに注意してください。
修飾された名前で Assembly.Load(String) を呼び出します。
前のステップが失敗した場合は、短い名前 (および、存在する場合は公開キー トークン) を使用して Assembly.Load(String) を呼び出します。
BAML (PresentationBuildTask)
BAML のアセンブリの読み込みには 2 つの側面があります。コンポーネントとして BAML が含まれる初期アセンブリの読み込みと、BAML の運用環境によって参照されている型の型バッキング アセンブリの読み込みです。
初期マークアップのアセンブリの読み込み:
マークアップの読み込み元であるアセンブリへの参照は、常に修飾されていません。
WPF XAML スキーマ コンテキストにより、最後に読み込まれたアセンブリから始めて、WPF アプリケーションの AppDomain が反復処理され、既に読み込まれているアセンブリから、名前のすべての部分が一致するものが検索されます。 一致するアセンブリが見つかった場合、それが解決に使用されます。
前のステップが失敗した場合は、短い名前 (および、存在する場合は公開キー トークン) を使用して Assembly.Load(String) を呼び出します。
BAML 型によるアセンブリ参照:
BAML の運用環境で使用される型のアセンブリ参照は、ビルド タスクの出力として常に完全修飾されます。
WPF XAML スキーマ コンテキストにより、最後に読み込まれたアセンブリから始めて、WPF アプリケーションの AppDomain が反復処理され、既に読み込まれているアセンブリから、名前のすべての部分が一致するものが検索されます。 一致するアセンブリが見つかった場合、それが解決に使用されます。
それ以外の場合は、次のいずれかの方法がアセンブリの読み込みに使用されます。
修飾された名前で Assembly.Load(String) を呼び出します。
短い名前と公開キー トークンの組み合わせが、BAML の読み込み元のアセンブリと一致する場合は、そのアセンブリが使用されます。
短い名前と公開キー トークンを使用して、Assembly.Load(String) を呼び出します。
関連項目
.NET Desktop feedback