다음을 통해 공유


기본 XAML 스키마 컨텍스트 및 WPF XAML 스키마 컨텍스트

XAML 스키마 컨텍스트는 특정 XAML 어휘를 사용하는 XAML 프로덕션이 형식 매핑 확인 방법, 어셈블리 로드 방법, 특정 reader 및 writer 설정 해석 방법 등 개체 쓰기 동작과 상호 작용하는 방식을 정규화하는 개념적 엔터티입니다. 이 항목에서는 .NET XAML Services의 기능 및 CLR 형식 시스템을 기반으로 하는 연결된 기본 XAML 스키마 컨텍스트를 설명합니다. 이 항목에서는 WPF에 사용되는 XAML 스키마 컨텍스트도 설명합니다.

기본 XAML 스키마 컨텍스트

.NET XAML Services는 기본 XAML 스키마 컨텍스트를 구현하고 사용합니다. 기본 XAML 스키마 컨텍스트 동작이 XamlSchemaContext 클래스의 API에서 항상 완전히 표시되지는 않습니다. 그러나 많은 경우 기본 XAML 스키마 컨텍스트의 영향을 받는 동작은 XamlMember 또는 XamlType의 멤버와 같은 XAML 형식의 공통 API를 통해 또는 기본 XAML 스키마 컨텍스트를 사용 중인 XAML reader 및 XAML writer에서 노출된 API를 통해 관찰할 수 있습니다.

XamlSchemaContext 구문을 호출하여 기본 동작을 캡슐화하는 XamlSchemaContext를 만들 수 있습니다. 이렇게 하면 기본 XAML 스키마 컨텍스트가 명시적으로 만들어집니다. XamlSchemaContext 입력 매개 변수를 명시적으로 사용하지 않는 API를 사용하여 XAML reader 또는 XAML writer를 초기화하는 경우 동일한 기본 XAML 스키마 컨텍스트가 암시적으로 만들어집니다.

기본 XAML 스키마 컨텍스트의 형식 매핑 동작은 CLR 리플렉션을 사용합니다. 여기에는 정의 CLR Type 및 관련 PropertyInfo 또는 MethodInfo 검사가 포함됩니다. 또한 형식 또는 멤버에 대한 CLR 특성은 CLR 지원 형식을 사용하는 XAML 형식 또는 XAML 멤버 정보에 대한 세부 정보를 채우기 위해 사용됩니다. CLR 형식 시스템에서 필요한 정보를 사용할 수 있으므로 기본 XAML 스키마 컨텍스트에는 Invoker 패턴과 같은 형식 시스템 확장 기법이 필요하지 않습니다.

어셈블리 로드 논리의 경우 기본 XAML 스키마 컨텍스트는 주로 XAML 네임스페이스 매핑에 제공된 어셈블리 값을 사용합니다. 또한 LocalAssembly는 내부 형식 로드와 같은 시나리오에 대해 로드할 어셈블리를 암시할 수 있습니다.

WPF XAML 스키마 컨텍스트

WPF 구현은 기본이 아닌 XAML 스키마 컨텍스트를 구현하여 도입할 수 있는 기능의 종류에 대한 흥미로운 예시를 제공하기 때문에 이 항목에서 WPF XAML 스키마 컨텍스트를 설명합니다. 또한 XAML 스키마 컨텍스트 개념은 WPF XAML을 다루는 WPF 설명서에서 많이 다루지 않습니다. XAML 스키마 컨텍스트로 가능한 동작은 기본 XAML 작동 방식에 대한 설명과 통합된 경우에만 완전히 이해할 수 있습니다. WPF XAML 스키마 컨텍스트는 다음 동작을 구현합니다.

조회 재정의: WPF에는 ContentPropertyAttribute 특성을 사용하지 않고 작동하는 XAML 콘텐츠 속성이 있는 몇 가지 XAML 콘텐츠 모델이 있습니다. LookupContentProperty는 WPF가 이 동작을 구현하도록 재정의합니다.

WPF 식 지연: WPF에는 런타임 컨텍스트를 사용할 수 있을 때까지 값을 지연하는 몇 가지 식이 있습니다. 또한 템플릿 확장은 지연 기법에 의존하는 런타임 동작입니다.

형식 시스템 조회 최적화: WPF에는 문자 그대로 수백 개의 WPF 정의 클래스에 상속되는 기본 클래스 멤버 정의를 포함하여 광범위한 XAML 어휘 및 개체 모델이 있습니다. 또한 WPF 자체는 여러 어셈블리에 분산되어 있습니다. WPF는 조회 테이블 및 기타 기법을 사용하여 형식 조회를 최적화합니다. 이렇게 하면 기본 XAML 스키마 컨텍스트 및 CLR 기반 형식 조회에 비해 성능이 향상됩니다. 조회 테이블에 형식이 없는 경우 동작은 기본 XAML 스키마 컨텍스트와 유사한 XAML 스키마 컨텍스트 기법을 사용합니다.

XamlType 및 XamlMember 확장: WPF는 종속성 속성을 사용하여 속성 개념을 확장하고, 라우트된 이벤트를 사용하여 이벤트 개념을 확장합니다. XAML 처리 작업에서 이러한 개념의 가시성을 높이기 위해 WPF는 XamlTypeXamlMember를 확장하고, 종속성 속성 및 라우트된 이벤트 특성을 보고하는 내부 속성을 추가합니다.

WPF XAML 스키마 컨텍스트 액세스

WPF System.Windows.Markup.XamlReader 또는 System.Windows.Markup.XamlWriter를 기반으로 하는 XAML 기법을 사용하는 경우 이러한 XAML reader 및 XAML writer 구현에서 WPF XAML 스키마 컨텍스트가 이미 사용되고 있습니다.

WPF XAML 스키마 컨텍스트를 사용하여 초기화되지 않는 다른 XAML reader 또는 XAML writer 구현을 사용하는 경우 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 Services의 어셈블리 로드는 CLR 정의 개념 AppDomain과 통합됩니다. XAML 스키마 컨텍스트는 AppDomain 및 기타 요소의 사용에 따라 어셈블리 로드 방법이나 런타임 또는 디자인 타임 시 형식을 찾는 방법을 해석합니다. XAML이 XAML reader의 느슨한 XAML인지, XamlBuildTask에 의해 DLL로 컴파일된 XAML인지 또는 WPF의 PresentationBuildTask에서 생성된 BAML인지에 따라 논리는 조금씩 다릅니다.

WPF용 XAML 스키마 컨텍스트는 WPF 애플리케이션 모델과 통합되고, 이 모델은 WPF 구현 세부 정보인 다른 요소뿐 아니라 AppDomain도 사용합니다.

XAML reader 입력(느슨한 XAML)

  1. XAML 스키마 컨텍스트는 애플리케이션의 AppDomain을 반복하여 가장 최근에 로드한 어셈블리에서부터 해당 이름의 모든 요소와 일치하는 이미 로드된 어셈블리를 찾습니다. 일치 항목이 있으면 해당 어셈블리가 확인에 사용됩니다.

  2. 그렇지 않으면 CLR Assembly API를 기반으로 하는 다음 기법 중 하나가 어셈블리를 로드하는 데 사용됩니다.

    • 매핑에서 이름이 정규화된 경우 정규화된 이름에서 Assembly.Load(String)을 호출합니다.

    • 이전 단계가 실패하는 경우 짧은 이름(있는 경우 공개 키 토큰)을 사용하여 Assembly.Load(String)을 호출합니다.

    • 매핑에서 이름이 정규화되지 않은 경우 Assembly.LoadWithPartialName을 호출합니다.

XamlBuildTask

XamlBuildTask는 Windows Communication Foundation(WCF) 및 Windows Workflow Foundation에 사용됩니다.

XamlBuildTask를 통한 어셈블리 참조는 항상 정규화됩니다.

  1. 정규화된 이름에서 Assembly.Load(String)을 호출합니다.

  2. 이전 단계가 실패하는 경우 짧은 이름(있는 경우 공개 키 토큰)을 사용하여 Assembly.Load(String)을 호출합니다.

BAML(PresentationBuildTask)

BAML의 어셈블리 로드에는 BAML을 구성 요소로 포함하는 초기 어셈블리 로드와 BAML 프로덕션에서 참조하는 모든 형식의 형식 지원 어셈블리 로드라는 두 가지 측면이 있습니다.

초기 태그의 어셈블리 로드:

태그를 로드할 어셈블리에 대한 참조는 항상 정규화되지 않습니다.

  1. WPF XAML 스키마 컨텍스트는 애플리케이션의 AppDomain을 반복하여 가장 최근에 로드된 어셈블리부터 해당 이름의 모든 요소와 일치하는 이미 로드된 어셈블리를 찾습니다. 일치 항목이 있으면 해당 어셈블리가 확인에 사용됩니다.

  2. 이전 단계가 실패하는 경우 짧은 이름(있는 경우 공개 키 토큰)을 사용하여 Assembly.Load(String)을 호출합니다.

BAML 형식별 어셈블리 참조:

BAML 프로덕션에서 사용되는 형식에 대한 어셈블리 참조는 항상 빌드 작업의 출력으로 정규화됩니다.

  1. WPF XAML 스키마 컨텍스트는 애플리케이션의 AppDomain을 반복하여 가장 최근에 로드된 어셈블리부터 해당 이름의 모든 요소와 일치하는 이미 로드된 어셈블리를 찾습니다. 일치 항목이 있으면 해당 어셈블리가 확인에 사용됩니다.

  2. 그렇지 않으면 다음 기법 중 하나가 어셈블리를 로드하는 데 사용됩니다.

    • 정규화된 이름에서 Assembly.Load(String)을 호출합니다.

    • 짧은 이름 + 공개 키 토큰 조합이 BAML이 로드된 어셈블리와 일치하는 경우 해당 어셈블리를 사용하세요.

    • 짧은 이름 + 공개 키 토큰을 사용하여 Assembly.Load(String)를 호출합니다.

참고 항목