2009-06-05 1 views
5

C# 프로그램이 해당 프로그램에서 사용되는 언어 기능을 지원하지 않는 C# 버전에서 컴파일되는 것을 어떻게 감지 할 수 있습니까?주어진 언어 나 컴파일러 버전을 요구하도록 C# 코드를 컴파일하는 방법은 무엇입니까?

C# 컴파일러는 지원하지 않는 언어의 기능을 발견하면 프로그램을 거부하고 오류 메시지를 표시합니다. 이것은 프로그램이 C# 컴파일러의 너무 오래된 버전 또는 C# 컴파일러의 필수 버전을 지원하지 않는 C# 컴파일러로 컴파일되고 있음을 나타내는 문제를 해결하지 않습니다.

이상적으로는 간단한

#if CS_VERSION < 3 
#error CSharp 3 or later is required 
#end 

답변

4

나는 당신이 다음의 MSBuild를 사용하는 경우는 C# 파일을하지만, 프로젝트/솔루션 도구 버전 번호가 MSBuild를 이전 버전으로 구축되는 것을 막을 수 있다는 것을 할 수 있다고 생각하지 않습니다 .

정확한 내용을 알려주시겠습니까? 기술적 인 것보다 하나의 "인간적인"해결책은 모든 "구형"버전으로 코드를 컴파일 해보고 다음과 같이 문서를 생성하는 것일 수 있습니다 : "과 같은 오류가 발생하면이을 잘못 사용했을 가능성이 높습니다 버전 ... "

더 간단하게 만들기 위해 고려해야 할 또 다른 옵션은"필수 기능 "파일 하나를 갖는 것입니다. 이것은 메인 애플 리케이션에 의해 사용되지 않을 것입니다,하지만 사용자가 먼저 컴파일하도록 요청하십시오. 작동하면 나머지 빌드가 작동합니다. 그렇지 않은 경우 잘못된 버전을 사용하기 때문입니다. 다른 버전의 오류 범위가 더 작을 가능성이 있습니다 (특히 컴파일러가 서로 다른 파일의 오류를 임의의 순서로 나열 할 수있는 문제는 없습니다).

+0

이전 버전의 C# 컴파일러 (.NET 2005)가 현재 버전 (.NET 2008) 이전 경로에서 선택되었으므로 명령 줄 컴파일러를 통해 생성 된 C# 코드가 다양한 오류로 손상되었습니다.), 버그가 C# 코드의 생성자에 없었 음이 즉시 명백하지 않았습니다. – grrussel

+0

알았어 - 그 컴파일러는 어떤 종류의 스크립트로 실행되고 있습니까? 그렇다면 RequiredFeatures.cs 파일이 유용 할 것입니다. –

+0

당신이 말하는 4.0 특정 기능을 강조 표시 할 수 있습니까?/langVersion과 어떻게 다른가? 나는 아래에 준 예제를 통해 무엇이되는지보고 싶습니다 ... –

3

전처리 지시어의 this list에 따르면, 이는 가능하지 않습니다. 일반적으로 자동 속성 (3.0) 또는 동적 (4.0)을 사용하여 제네릭 (2.0 감지)을 사용하여 알 수 있습니다.

2

미리 정의 된 기호는 없습니다. 자신 만의 심볼을 만들어 빌드 스크립트에서 정의 할 수 있습니다. C# 1.2

  • ISO-2는 C#을

    • ISO-1은 다음과 같습니다> 언어 버전 - -> 빌드 -> 고급

      프로젝트 속성 : 프로젝트 레벨에서 언어 버전을 해결할 수 있습니다 2.0

    합니다 (csc /langversion 매개 변수지도)

    그러나이 모든 것을 포함하지 않습니다 -이 통해 할 것 몇 가지가 있습니다 - 펜실바니아 제네릭 유형 추론의 영역에서 rticularly. 이전 컴파일러를 지원해야하는 경우에만 문제가됩니다. 이 경우 ... 테스트에 오래된 컴파일러가 있습니다. 예를 들어

    :이/ISO-2 (의사 C# 2.0) .NET 3.5에서 작동하지만, .NET 2.0 (2.0 C# 적절한를)에서 작동하지 않습니다

    int[] arr1 = { 1, 2, 3, 4, 5 }; 
    string[] arr2 = Array.ConvertAll(arr1, delegate (int i) {return i.ToString();}); 
    

    .

  • 0

    아마도 당신은 supportedRuntime 요소를 읽을 수 있습니다

    그런 다음 당신은 당신이 CSharpProjectConfigurationProperties3.DefineConstants를 사용하여 supportedRuntime에 따라 원하는 지시어를 정의 할 수 있습니다.

    VS에 매크로를 만들어 사용할 수 있습니다.

    1

    간편함 : 컴파일러가 실패하고 코드를 컴파일 할 수없는 경우 오류가 발생합니다.

    +0

    당신은 생각하지 않습니까? – Will

    관련 문제