2012-05-30 3 views
6

Visual sudio 2010에 새로운 프로그래밍 언어를 추가하려고합니다. 나는 가장 좋은 접근법에 대해 다소 혼란스러워합니다.Visual Studio 2010 MEF vs MPF?

MPF를 살펴본 결과 구문 강조 표시, 외부 구문 분석기 연결 등 몇 가지 예제를 발견했으며 매우 간단합니다.

그런 다음 MEF라는 무엇인가와 Visual Studio의 새로운 확장 성 모델에 대해 읽었습니다. 나는 그것에 대해 놀았고 몇몇 샘플을 따라 가면서 구문을 강조하는 구문을 얻었다. 이제, MEF를 사용하면 ParseSOurce 등을 사용하는 MPF처럼 내 구문 분석기에서 필자의 언어를 연결하는 방법을 놓치게됩니다. ANTLR btw를 사용하고 있습니다.

MEF는 강조, 장식 등과 같은 편집기의 시각적 요소만을위한 것입니까? 아니면 언어 서비스를 구현할 수 있습니까?

내가 수집 한 것에서 MEF가 새롭고 권장되는 접근 방식이지만 일반 MPF보다 새로운 언어를 만드는 것이 더 어려워 보입니다. MPF는 여전히 좋은 접근 방법입니까?

+3

가장 좋은 방법 중 하나는 현재 프로젝트에서 수행하는 작업을 연구하는 것입니다. IronPython과 "Python Tools for Visual Studio"에서 Python 언어에 대한 지원을 VS에 추가하는 방법을 살펴보십시오. –

+0

이 질문은 아직 받아 들여지지 않은 대답입니다. 내 대답이 도움이 되었습니까? 아니면 자세한 내용이 필요합니까? = 3 –

+0

Yikes, 나는 이것에 대해 잊어 버렸습니다. 당신의 대답은 매우 도움이되어 주셔서 감사 드리며 저는 MPF 경로를갔습니다. –

답변

4

MEF (Managed Extensibility Framework)은 .NET에서 Visual Studio와 같은 프로그램을 확장하는 일반적인 프로그래밍 방식입니다. VS 패키지/확장은 MPF 클래스 대신 최신 VS-MEF 클래스 (계약)를 사용할 수 있습니다. MEF는 [Export] 속성으로 장식 된 수업에서 인정됩니다. 일반적으로 색상 지정 가능 항목과 같은 특정 클래스를 상속 받아 Visual Studio로 내 보낸 다음 MEF 패키지의 모든 내보내기를 조회하여 가져옵니다.

MPF (Managed Package Framework)은 비 관리/네이티브 VS 확장 모델의 구형 COM 래퍼 주위의 클래스 시스템과 같습니다. 프로그래밍 방식으로 서비스를 가져 와서 Visual Studio를 확장하고 MPF 클래스의 메서드를 구현합니다. MPF 클래스는 VS의 COM 래퍼의 COM 같은 인터페이스를 구현합니다. 예를 들어 LanguageServiceIVsLanguageInfo 및 일부 다른 인터페이스를 구현하지만 단순히 메서드를 "수집"합니다. 당신이 당신의 LanguageService 구현 클래스에서 오버라이드 (override) 할 수있는 인터페이스들).

완전한 프로그래밍 언어를 구현하려는 경우 MPF와 MEF를 결합합니다. 당신은 새로운 도구 창, 속성 페이지 등 당신이 할 수있는 대신 MPF의

같은 다른 VS 물건에 대한 중괄호 일치 등을 MPF, 요약, (구문 강조를 위해 필요) 토큰과 같은 에디터 부품 MEF를 사용 이전 COM 래퍼를 사용하지만 MPF 클래스는 COM 래퍼를 선택하면 처리해야하는 COM 작업을 이미 수행합니다.

또한 토크 나이저 등을 MPF로 구현할 수도 있지만 시도해 보니 MEF보다 훨씬 직관적이지 않습니다. 당신이 나에게 묻는다면, 그것은 훨씬 더 어렵고, MEF보다 더 많은 braindamage를 필요로한다. 그러나 나는 MPF와 함께했던 것에 따라 MEF와 멀지 않은 채로있다.

MSDN이 MEF와 MPF의 기사를 섞어 버렸기 때문에 다소 혼란 스럽습니다. MSDN의 하위 섹션에서 MEF 카테고리를 실수로 쉽게 MPF로 전환 할 수 있다는 것을주의 깊게 관찰해야합니다. 그러나 MSDN에서는 VS 확장에 대한 일반적인 기사에서 예를 들어 다음과 같이 힌트를 표시합니다. http://msdn.microsoft.com/en-us/library/cc138569.aspx

0

현재 MEF (VS2013)에서만 언어 서비스를 구현 중입니다.

문법 강조 표시 (ITagger<ClassificationTag>으로 할 수 있음)와 몇 가지 기본 제공 특수 목적 MEF 인터페이스 (예 :당신이 일반적으로 구현하는 배경 파싱과 같은 일들을 수행하기 위해 필요에 따라 구현하는 옵션 페이지와 다양한 유형의 인텔리 센스에 대해 파일을 열 때 물건을 수행하십시오. 또는 패키지의 Initialize 메소드를 엔트리 포인트로 사용하여 백그라운드에서 프로젝트 계층을 트래버스 할 수 있습니다.

Intellisense 기능 등을 사용하면 특정 명령에 응답해야 할 수도 있습니다 (예 : 완료 목록 상자를 팝업 할시기를 알아보기 위해 키 스트로크 모니터링). IOleCommandTarget을 구현하고 관련 명령을 처리하여 처리 할 수 ​​있습니다 (텍스트보기를 만들 때 에서 AddCommandFilter을 호출하여 수동으로 명령 처리기를 연결).

지금까지는 MEF를 통해 할 수없는 일은 없었습니다 (전혀 할 수없는 일을 제외하고는). MPF는 필자가 필요로하지 않았기 때문에 결코 본 적이 없다.

(하루의 끝에 그주의는, 코드는 MEF 배관, VS의 SDK 인터페이스와 헬퍼 클래스 및 EnvDTE의 버릇의 수프를 닮은 경향이있다.)

0

사용 MEF를 통해 노출되는 기능에 대한 MEF. 다른 기능은 사례별로 처리됩니다 (특정 기능을 구현하는 데 문제가있는 경우 특정 질문을하십시오). MPF를 사용하는 유일한 방법은 프로젝트 시스템입니다 (MPF for Projects 또는 MPFProj). 백그라운드 구문 분석을 처리하려면 내 BackgroundParser 구현 (MIT 라이선스)을 살펴 보는 것이 좋습니다. 그것은 비록 내가 그것을 위해 TPL을 사용하고 ReParseImpl이 동 기적으로 실행하는 대신에 Task을 반환했으면 좋겠지 만 꽤 잘 동작한다. 도입과 BackgroundParser의 사용 및 일부 필수 헬퍼 클래스를 보여주는

  • BackgroundParser.cs
  • Commit 0d3e55e

      .