다음을 통해 공유


편집기의 Managed Extensibility Framework

편집기는 MEF(Managed Extensibility Framework) 구성 요소로 빌드됩니다. 고유한 MEF 구성 요소를 빌드하여 편집기를 확장할 수 있으며 코드도 편집기 구성 요소를 사용할 수 있습니다.

MEF는 MEF 프로그래밍 모델을 따르는 애플리케이션이나 구성 요소의 기능을 추가하고 수정할 수 있는 .NET 라이브러리입니다. Visual Studio 편집기에서 MEF 구성 요소 파트를 제공하고 사용할 수 있습니다.

MEF는 .NET Framework 버전 4 System.ComponentModel.Composition.dll 어셈블리에 포함되어 있습니다.

MEF에 대한 자세한 내용은 MEF(Managed Extensibility Framework)를 참조하세요.

구성 요소 파트 및 컴퍼지션 컨테이너

구성 요소 파트는 다음 중 하나(또는 둘 다)를 수행할 수 있는 클래스나 클래스 멤버입니다.

  • 다른 구성 요소 사용

  • 다른 구성 요소에서 사용

    예를 들어 웨어하우스 인벤토리 구성 요소에서 제공하는 제품 가용성 데이터에 따라 주문 항목 구성 요소가 있는 쇼핑 애플리케이션을 가정해 보겠습니다. MEF 관점에서 인벤토리 파트는 제품 가용성 데이터를 내보낼 수 있으며 주문 항목 파트는 데이터를 가져올 수 있습니다. 주문 항목 파트와 인벤토리 파트는 서로를 알 필요가 없습니다. 컴퍼지션 컨테이너(호스트 애플리케이션에서 제공)는 내보내기 세트를 유지하고 내보내기와 가져오기를 확인해야 합니다.

    일반적으로 호스트에서 컴퍼지션 컨테이너 CompositionContainer를 소유합니다. 컴퍼지션 컨테이너는 내보낸 구성 요소 파트의 카탈로그를 유지합니다.

구성 요소 파트 내보내기 및 가져오기

공용 클래스나 클래스의 공용 멤버(속성 또는 메서드)로 구현되는 한 모든 기능을 내보낼 수 있습니다. ComposablePart에서 구성 요소 파트를 파생시킬 필요가 없습니다. 대신 내보낼 클래스나 클래스 멤버에 ExportAttribute 특성을 추가해야 합니다. 이 특성은 다른 구성 요소 파트가 기능을 가져올 수 있는 계약을 지정합니다.

내보내기 계약

ExportAttribute는 내보내는 엔터티(클래스, 인터페이스 또는 구조체)를 정의합니다. 일반적으로 내보내기 특성은 내보내기 형식을 지정하는 매개 변수를 취합니다.

[Export(typeof(ContentTypeDefinition))]
class TestContentTypeDefinition : ContentTypeDefinition {   }

기본적으로 ExportAttribute 특성은 내보내기 클래스 형식인 계약을 정의합니다.

[Export]
[Name("Structure")]
[Order(After = "Selection", Before = "Text")]
class TestAdornmentLayerDefinition : AdornmentLayerDefinition {   }

이 예제에서 기본 [Export] 특성은 [Export(typeof(TestAdornmentLayerDefinition))]과 동일합니다.

다음 예제와 같이 속성이나 메서드를 내보낼 수도 있습니다.

[Export]
[Name("Scarlet")]
[Order(After = "Selection", Before = "Text")]
public AdornmentLayerDefinition scarletLayerDefinition;

MEF 내보내기 가져오기

MEF 내보내기를 사용하려는 경우 내보낸 계약(일반적으로 형식)을 알고 해당 값이 있는 ImportAttribute 특성을 추가해야 합니다. 기본적으로 가져오기 특성은 수정하는 클래스의 형식인 매개 변수 하나를 취합니다. 다음 코드 줄은 IClassificationTypeRegistryService 형식을 가져옵니다.

[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;

가져오기/내보내기 문제 해결: MEF 컴퍼지션 오류 로그에 액세스

현재 VS 설치에 없는 항목을 가져오거나 가져오기 또는 내보내기를 잘못 작성하는 경우 문제가 발생할 수 있습니다. 이러한 문제를 찾고 해결하는 주요 방법은 %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err에 저장된 MEF(Managed Extensibility Framework) 컴퍼지션 오류 로그를 참조하는 것입니다.

MEF 구성 요소 파트에서 편집기 기능 가져오기

기존 코드가 MEF 구성 요소 파트인 경우 MEF 메타데이터를 사용하여 편집기 구성 요소 파트를 사용할 수 있습니다.

MEF 구성 요소 파트에서 편집기 기능 사용하기

  1. GAC(전역 어셈블리 캐시)에 있는 System.Composition.ComponentModel.dll 및 편집기 어셈블리에 대한 참조를 추가합니다.

  2. 관련 using 지시문을 추가합니다.

    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text;
    
  3. 다음과 같이 [Import] 특성을 서비스 인터페이스에 추가합니다.

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. 서비스를 가져온 경우 해당 구성 요소 중 하나를 사용할 수 있습니다.

  5. 어셈블리를 컴파일한 경우 Visual Studio 설치의 *..\Common7\IDE\Components* 폴더에 배치합니다.