2014-09-13 7 views
3

저는 Visual Studio Extension을 제작하고 있는데, Visual Studio 버전이 실행되고있는 특정 인터페이스의 다른 구현을 [내보내기]하고 싶습니다. 예를 들어 Visual Studio 2010 및 2012에 대한 구현 하나와 Visual에 대한 다른 구현 스튜디오 2013 및 비주얼 스튜디오 "14".Visual Studio 확장 성 - Visual Studio 버전마다 다른 MEF 내보내기?

각 Visual Studio 버전마다 다른 DLL을 간단히 배포 할 수 있다는 것을 알았지 만 동일한 DLL과 동일한 vsixmanifest를 제공하는 방법이 있는지 궁금합니다. 그러나 내 확장을 동적으로 가져 오는 것이 좋습니다. 정확한 버전의 인터페이스.

가장 효과적인 방법은 무엇입니까?

답변

2

그것은 당신이 실제로 별도의 수출을 가지고이 필요 귀하의 질문에서 명확하지 않다. 비주얼 스튜디오의 여러 버전을 지원하기위한 몇 가지 옵션을 사용할 수 있습니다

  1. 이전 당신이 지원하고자하는 비주얼 스튜디오의 최소 버전을 확인, 단지 비주얼 스튜디오의 버전에서 immutable and/or versioned assemblies을 참조합니다. 확장 프로그램은 변경이나 특별한 고려 사항없이 여러 버전에서 작동합니다. "적당히"가능할 때마다 이것이 최선의 선택입니다.

  2. 단일 항목을 내보내지만 특정 버전의 Visual Studio를 대상으로하는 어셈블리를 사용하여 구현하십시오. 예를 들어, 상속 여백 확장 기능을 사용하려면 버전없는 어셈블리에 대한 참조가 필요하므로 지원되는 Visual Studio 버전마다 별도의 구현을 포함해야합니다. single common exported object CSharpInheritanceTaggerProvider을 제공함으로써 구현되지만, 태그 지정자 자체의 구현은 dynamically selected assembly으로 위임됩니다.

  3. 여러 항목을 내보내지만 현재 Visual Studio 버전과 관련된 작업 만 수행하십시오. GitDiffMargin 확장은이 기능을 사용하여 스크롤 여백 컨트롤을 가장 적절한 위치에 배치합니다. 어셈블리에 버전없는 어셈블리에 대한 참조가 필요하지는 않지만 Visual Studio 2013부터는 UI에서이 여백의 최적 위치가 변경되고 MEF 메타 데이터 특성이 정적으로 배치를 결정합니다. 단지 몇 분 안에이 생각

2

인터페이스를 구현하는 단일 클래스를 내보내고 해당 클래스 기능을 Visual Studio 버전에 따라 실제 구현에 대한 프록시로 사용할 수 있습니다. 예를 들어 :

[Export(typeof(IMyInterface))] 
public class ProxyClass : IMyInterface 
{ 
    private IMyInterface impl; 
    public ProxyClass() 
    { 
     if (IsVs2014()) 
     { 
      impl = new Vs2014Impl(); 
     } 
     else 
     { 
      impl = new Vs2013Impl(); 
     } 
    } 

    public void DoSomething() 
    { 
     impl.DoSomething(); 
    } 
} 
+0

참고로, 이것은 @ JaredPar가 VsVim에서 Proxy 대신 Factory를 사용하는 것과 비슷합니다. - ISharedService 인터페이스와 [SharedServiceFactory.cs] (https://github.com/jaredpar/VsVim/blob)가 있습니다. /848f333b942eaa2ddde2cbfb08362d03d0491f7a/Src/VsVimShared/Implementation/SharedService/SharedServiceFactory.cs) 모든 다른 구현을 '가져오고'VS 버전별로 올바른 것을 선택합니다. –

0

나는이 시도하지 않은, 어쩌면 그것은 작동 할 수 있습니다

public enum VisualStudioVersion 
{ 
    Unknown, 

    VS2010, 
    VS2012, 
    VS2013, 

    VS14 
} 

public class VsSpecificExportAttribute : ExportAttribute 
{ 
    // the place for this is not right, 
    // but you can figure this out on your own. 
    private static VisualStudioVersion _currentVisualStudioVersion = 
     VisualStudioVersion.VS2013; 

    class DummySentil{} 

    public VsSpecificExportAttribute(Type typeToExport, 
     VisualStudioVersion visualStudioVersion) 
     : base(visualStudioVersion == _currentVisualStudioVersion ? 
       typeToExport : typeof(DummySentil)) 
    { 
    } 
} 

는 다음 사용할 수 그것으로;

[VsSpecificExport(typeof(IWpfTextViewCreationListener), VisualStudioVersion.VS14)] 
public class MyTextViewCreationListener: IWpfTextViewCreationListener 
{ 

} 

기본이되는 아이디어는 우리가 "비주얼 스튜디오 버전"올바른에있는 wheenever은 "VsSpecificExport은"속성이 결정하는 것입니다, 우리가하지 않은 경우, 우리는 절대적으로 아무것도하지 않는다 "DummySentil"클래스를 내보낼 예정 아무도 사용하지 않습니다.

+0

흥미로운 접근 방법입니다. 작동하는지 여부는 알고 싶습니다. –

+0

속성이 "동적"이 아니기 때문에 작동하지 않을 수도 있습니다. 예를 들어, 컴파일시 어셈블리의 메타 데이터에 저장됩니다. –