.NET Framework 버전으로 조건부 컴파일이 가능합니까?
-
11-09-2019 - |
문제
MFC로 작업 할 때 다시 기억할 수 있습니다. 여러 버전의 MFC 프레임 워크를 확인하여 _MFC_VER
매크로.
나는 지금 .NET 4로 일을하고 있으며 몇 개의 지점에서 튜플을 사용하고 싶지만 여전히 다른 모든 것을 3.5와 호환 할 수 있습니다.
나는 다음과 같은 것을 찾고 있습니다.
#if DOTNET4
public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif
해결책
사용할 수있는 내장 프리 컴파일러 상수는 없습니다. 그러나 각 구성과 고유 한 정의 상수 세트와 대상 프레임 워크 버전을 갖는 각 구성과 함께 자신만의 빌드 구성을 쉽게 만들 수 있습니다. 많은 사람들이 조건부로 32 또는 64 비트 차이를 컴파일하기 위해이 작업을 수행합니다.
다른 팁
.csproj (또는 .vbproj, 이론적으로)에서 사용자 정의 컴파일 기호를 정의 할 때 알아야 할 큰 경고가 있습니다. 이전에 정의 된 모든 컴파일 기호를 덮어 씁니다. 예를 들어 MSBuild 스 니펫을 고려하십시오.
<PropertyGroup Condition="'$(TargetFrameworkVersion)' == 'v4.0'">
<DefineConstants>$(DefineConstants);DOTNET_40</DefineConstants>
</PropertyGroup>
<PropertyGroup>
<DefineConstants>ITS_CLOBBERING_TIME</DefineConstants>
</PropertyGroup>
두 번째 정의 구성 요소는 그 값이 알 수 있듯이 정의의 첫 번째 값을 클로브합니다. 이를 피하려면 두 번째 정의 구성 요소를 다시 작성하여 다음과 같이 보이게하려고합니다.
<DefineConstants>$(DefineConstants);ITS_CLOBBERING_TIME</DefineConstants>
또한, 이것을 정의 된 속성 그룹 안에 배치하고 싶을 것입니다. ~ 후에 Visual Studio 2010과 같이 다른 모든 PropertyGroups는 현재 사용자 정의 컴파일 기호를 추가하여 Visual Studio가 정의하기 전에 배치 된 경우 정의하는 다른 사용자 정의 컴파일 기호를 막을 수있는 방식으로 추가됩니다. 이 문제를 Microsoft에 제출했습니다. 진행 상황을 추적 할 수 있습니다 Microsoft Connect.
참고로, 조건부 편집 코드는이를 만나는 프로그래머를 좌절시킵니다.
주석을 바탕으로 편집
자신의 수업을 작성하는 것이 더 나을 것입니다. 그래서 당신은 그것이 할 일을 보장 할 수 있고, 이상한 서명이나 상속 문제가 없습니다.
public class Pair<TSource, TResult>
{
public TSource Source { get; set; }
public TResult Result { get; set; }
public Pair() {}
public Pair(TSource source, TResult result)
{
Source = source;
Result = result;
}
// Perhaps override Equals() and GetHashCode() as well
}
언제나 그렇듯이 내장 물건을 사용하여 체중을 측정하는 것이 좋습니다. 일반적으로 그것은 "이 코드를 유지하고 지원해도 괜찮습니까?"라고 스스로에게 묻는 것을 의미합니다. vs. "코드는 내가 필요한 것을 상자 밖으로 나가는가?"
이 경우, 당신은 Tuple<T1, T2>
, 나는 단지 다른 개발자들이 쉽게 숨을 쉴 수 있도록 당신 자신의 간단한 것을 씁니다 :)
다른 프로젝트가 있어야하므로 부분적으로 프로젝트를 가질 수 있으며 각 프로젝트에 필요한 클래스 만 설명 할 수 있습니다.
classname.cs public partial className {...}
classname.40.cs public partial classname {public tuple somemethod () {...}}
classname.35.cs public partial classname {public keyvaluepair somemethod () {...}}