C#의 프레임 워크 버전에 따라 조건부 컴파일
-
03-07-2019 - |
문제
같은 것을 허용하는 전처리 기호가 있습니까?
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
아니면 이것을하는 다른 방법?
해결책
사전 정의 된 '사전 처리기'기호가 있다고 생각하지 않습니다. 그러나 다음과 같이 원하는 것을 달성 할 수 있습니다.
지원하려는 CLR의 모든 버전마다 프로젝트의 다른 구성을 만듭니다.
같은 기호를 선택하십시오
VERSION2
,VERSION3
CLR 버전 별 등.모든 구성에서 그와 관련된 하나의 기호를 정의하고 다른 모든 기호를 정의하지 마십시오.
조건부 컴파일 블록 에서이 기호를 사용하십시오.
다른 팁
내장은 없지만 직접 공급할 수 있습니다.
이 특정 시나리오의 경우 로직 (예 : 래퍼) 클래스를 캡슐화하여 #if
모든 코드를 통해 산란; 물론, 당신이 약간의 잠금 만하고 있다면 그것은 문제가 될 가치가 없을 수도 있습니다.
다양한 구성 및/또는 프로젝트를 사용하여 다양한 플랫폼을 위해 구축합니다. protobuf-net 이 트릭을 사용하여 .NET 2.0, .NET 3.0, Mono, CF 2.0, CF 3.5에 대한 빌드. 코드는 있습니다 #if
로직을 제어하기 위해 다른 기호를 기반으로 한 블록 - 예를 들어, BinaryFormatter
CF에서는 사용할 수 없습니다. WCF
.NET 3.0에서만 사용할 수 있습니다. Delegate.CreateDelegate
CF 2.0 등에는 그렇지 않습니다.
반사를 사용하여 ReaderWriterLockSlim과 같은 특정 유형을 사용할 수 있는지 (전 처리기를 사용하는 대신) 동적으로 확인할 수 있습니다.
이렇게하면 단일 버전의 제품 및 사용자가있는 사용자를 배포 할 수 있으며 .NET 3.5가 최적화 된 코드의 혜택을받을 수 있습니다.
이 기호를 수동으로 설정할 수 있습니다 /컴파일러 스위치 정의. 그런 다음 원하는 각 CLR 버전에 대해 다른 빌드 구성을 만듭니다.
그게 당신이해야 할 전부라면, 나는 당신을 생각합니다 ~할 수 있었다 환경을 사용하십시오 디보 해결책, 그것은 많은 불필요한 코드를 남겨 두는 것 같습니다.