[C#] 조건부 컴파일 및 프레임 워크 대상


Answers

지금까지 나를 위해 일하는 대안은 다음을 프로젝트 파일에 추가하는 것입니다.

 <PropertyGroup>
    <DefineConstants Condition=" !$(DefineConstants.Contains(';NET')) ">$(DefineConstants);$(TargetFrameworkVersion.Replace("v", "NET").Replace(".", ""))</DefineConstants>
    <DefineConstants Condition=" $(DefineConstants.Contains(';NET')) ">$(DefineConstants.Remove($(DefineConstants.LastIndexOf(";NET"))));$(TargetFrameworkVersion.Replace("v", "NET").Replace(".", ""))</DefineConstants>
  </PropertyGroup>

이 값은 "v3.5"와 같은 TargetFrameworkVersion 속성 값을 사용하여 "v"및 "." 새로운 " Property Functions" 기능을 사용하여 "NET35"를 얻습니다. 그런 다음 기존 "NETxx"값을 제거하고이를 DefinedConstants 끝에 추가합니다. 이것을 합리화하는 것이 가능할 수도 있지만, 나는 피들이 할 시간이 없다.

VS에서 프로젝트 속성의 빌드 탭을 보면 조건부 컴파일 기호 섹션에 결과 값이 표시됩니다. 응용 프로그램 탭에서 대상 프레임 워크 버전을 변경하면 심볼이 자동으로 변경됩니다. #if NETxx 전 처리기 지시문을 일반적인 방법으로 사용할 수 있습니다. VS에서 프로젝트를 변경해도 사용자 지정 PropertyGroup이 손실되는 것 같지 않습니다.

이것이 클라이언트 프로파일 타겟 옵션에 대해 다른 것을 제공하는 것처럼 보이지는 않지만 저에게는 문제가 아닙니다.

Question

대상 프레임 워크가 새로운 버전 인 경우 내 프로젝트의 코드가 크게 향상 될 수있는 몇 가지 사소한 곳이 있습니다. 나는 조건부 컴파일을 C #에서보다 잘 활용하여 필요할 때마다 전환 할 수 있기를 바랍니다.

같은 것 :

#if NET40
using FooXX = Foo40;
#elif NET35
using FooXX = Foo35;
#else NET20
using FooXX = Foo20;
#endif

이 기호 중 하나라도 무료로 제공됩니까? 이 기호를 프로젝트 구성의 일부로 주입해야합니까? MSBuild에서 어떤 프레임 워크를 목표로 삼고 있는지 알 수 있기 때문에 쉽게 할 수 있습니다.

/p:DefineConstants="NET40"

업데이트 : 제 질문은 사람들이이 상황을 어떻게 다루는 것입니까? 다른 구성을 만들고 있습니까? 명령 줄을 통해 상수를 전달합니까?




@Azarien, 당신의 대답은 Jeremy 's와 결합하여 Debug | Release 등이 아닌 한 곳에 보관할 수 있습니다.

나를 위해 #if NETXX를 사용하는 코드의 조건을 포함하여 두 변형을 모두 사용하는 것이 가장 효과적이며 한 번에 다른 프레임 워크 버전을 구축 할 수도 있습니다.

내 .csproj 파일에 다음 내용이 있습니다.

  <PropertyGroup>
    <DefineConstants Condition=" '$(TargetFrameworkVersion.Replace(&quot;v&quot;,&quot;&quot;))' &gt;= '4.0' ">NET_40_OR_GREATER</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(TargetFrameworkVersion.Replace(&quot;v&quot;,&quot;&quot;))' == '3.5' ">
    <DefineConstants>NET35</DefineConstants>
    <OutputPath>bin\$(Configuration)\$(TargetFrameworkVersion)</OutputPath>
  </PropertyGroup>

목표 :

  <Target Name="AfterBuild">
    <MSBuild Condition=" '$(TargetFrameworkVersion.Replace(&quot;v&quot;,&quot;&quot;))' &gt;= '4.0' "
      Projects="$(MSBuildProjectFile)"
      Properties="TargetFrameworkVersion=v3.5"
      RunEachTargetSeparately="true"  />
  </Target>



상수를 지우는 것으로 시작하십시오.

<PropertyGroup>
  <DefineConstants/>
</PropertyGroup>

다음과 같이 디버그, 추적 및 기타 상수를 빌드하십시오.

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <Optimize>false</Optimize>
  <DefineConstants>TRACE;DEBUG;$(DefineConstants)</DefineConstants>
</PropertyGroup>

마지막으로 프레임 워크 상수를 빌드하십시오.

<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v2.0' ">
  <DefineConstants>NET10;NET20;$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v3.0' ">
  <DefineConstants>NET10;NET20;NET30;$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v3.5' ">
  <DefineConstants>NET10;NET20;NET30;NET35;$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v4.0' ">
  <DefineConstants>NET10;NET20;NET30;NET35;NET40;$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v4.5' ">
  <DefineConstants>NET10;NET20;NET30;NET35;NET40;NET45;$(DefineConstants)</DefineConstants>
</PropertyGroup>

나는이 접근법이 매우 읽기 쉽고 이해할 수 있다고 생각한다.