2013-04-15 2 views
3

라이브러리를 작성 중이므로 가능한 경우 클래스를 구현하고 IReadOnlyList<T>을 사용하도록합니다. 그러나이 인터페이스는 프레임 워크 버전 4.5부터 사용할 수 있으며이 인터페이스로 인해 해당 버전에 묶이지 않기를 바란다.프레임 워크 버전에 따라 인터페이스 구현

라이브러리 용으로 두 버전의 라이브러리를 자동으로 컴파일 할 수있는 방법이 있습니까? 하나는 4.5 (인터페이스를 구현하고 다른 기능도 포함 할 수 있습니다), 3.5는 또 다른 버전입니까?

예를 들어 MSBuild 구성에서 "두 개 이상의 버전으로이 라이브러리를 컴파일하십시오"라는 메시지를 찾고 정의 된 기호, 프레임 워크, 참조 등과 같이 각각에 대해 다른 옵션을 지정합니다.

이것이 가능하다면 실제로 내가 겪어 온 다른 유사한 문제를 해결할 수 있습니다.

+1

나는 '그리고 나는 수업이었다'고했을 때 나는 더 나은 질문을 좋아했다 : D – Nolonar

+1

가능한 [C#의 프레임 워크 버전에 따른 조건부 컴파일] (http://stackoverflow.com/questions/408908/conditional -compilation-dependent-on-the-c-sharp) –

+0

죄송합니다. 전 처리기 지시문이 타입 정의에서 작동한다는 것을 몰랐습니다. 그러나 질문은 정확히 동일하지 않습니다. 필자는 라이브러리의 두 가지 다른 버전을 자동으로 컴파일하는 방법을 구체적으로 요구하고 있습니다. – GregRos

답변

6

예를 들어, 컴파일러 지시문을 사용할 수 있습니다.

#if NET45 
//specific code for .NET 4.5 
#endif 

이어서 단일 코드베이스를 유지하기 위해 Project Linker을 사용하여 두 개의 프로젝트, 각 버전을 생성한다. .NET 4.5 프로젝트에서는 빌드시 NET45 변수를 지정할 수 있습니다. 이 방법으로 #if 블록의 코드는 버전 중 하나에서만 사용됩니다.

+0

감사합니다. 이것이 가능한 해결책입니다. 하지만 자동으로이 작업을 수행 할 수있는 방법이 있습니까? – GregRos

+2

프로젝트 구조를 설정해야하지만 일회성 작업입니다. – Bas

+0

사실입니다. 그것은 아주 잘 작동합니다. – GregRos

4

서로 다른 프레임 워크 버전을 대상으로 두 가지 버전의 프로젝트 파일을 만들 수 있습니다. 이 경우 모든 프로젝트 파일을 기존 프로젝트 디렉토리에 배치합니다.

각 프로젝트에서 (필요에 따라) 프레임 워크 버전을 나타내는 기호를 정의해야합니다 (예 : DOTNET45).

class MyClass<T> : IList<T> 
#if DOTNET45 
    , IReadOnlyList<T> 
#endif 
{ 
    // Your usual code 

    #if DOTNET45 

    // IReadOnlyList implementation 

    #endif 
} 

이 그러나 지저분한 얻을 수 : 그런 다음이 #if directive 사용할 수있는 조건부 컴파일 기호

- 빌드 - 당신은 속성에서이 작업을 수행 할 수 있습니다. 그래서 잠재적으로 당신 만의 .NET 4.5 버전에서이 부분 클래스 파일을 포함하여, 모두 #if없이 할 수있는,

partial class MyClass<T> 
{ 
} 

#if DOTNET45 

partial class MyClass<T> : IReadOnlyList<int> 
{ 
    // IReadOnlyList implementation 
} 

#endif 

분명히 부분 클래스도 이상 나눌 수있는 파일 : 그래서 다른 방법으로는 부분 클래스를 사용할 수 있습니다 계획.

+0

그게 좋은 해결책입니다! 여분의 부분 클래스 정의를 사용하여 메소드 및 이와 유사한 것을 포함하여 모든 .NET 4.5 인터페이스를 저장할 수 있습니다. – GregRos

관련 문제