2010-03-07 5 views
3

저는 C# 클래스 라이브러리를 만들고 Visual Web Developer/Visual C# 2010의 베타 2를 사용하고 있습니다. 라이브러리가 빌드 된 .NET 버전에 대한 정보를 저장하려고합니다. v4.0의 .NET 버전 정의는 어떻게 되었습니까?

// What version of .net was it built under? 
#if NET_1_0 
     public const string NETFrameworkVersion = ".NET 1.0"; 
#elif NET_1_1 
     public const string NETFrameworkVersion = ".NET 1.1"; 
#elif NET_2_0 
     public const string NETFrameworkVersion = ".NET 2.0"; 
#elif NET_3_5 
     public const string NETFrameworkVersion = ".NET 3.5"; 
#else 
     public const string NETFrameworkVersion = ".NET version unknown"; 
#endif 

그래서 난 그냥 추가 할 수 있습니다 생각 : 과거에 내가 이것을 사용할 수 있었다

#elif NET_4_0 
     public const string NETFrameworkVersion = ".NET 4.0"; 

을 이제 프로젝트 -> 속성에서, 내 목표 프레임 워크는 ".NET 프레임 워크 4 ". 내가 확인한 경우 :

Assembly.GetExecutingAssembly().ImageRuntimeVersion 

내 런타임 버전이 v4.0.21006임을 알 수 있습니다. 따라서 CPU에 .NET 4.0이 설치되어 있습니다. 나는 당연히 내 NETFrameworkVersion 변수가 ".NET 4.0"을 보유 할 것을 기대합니다. 그렇지 않습니다. 그것은 ".NET 버전을 알 수 없음"을 보유합니다.

제 질문은 왜 NET_4_0이 정의되지 않았습니까? 명명 규칙이 변경 되었습니까? 버전> 3.5에서 .NET 프레임 워크 빌드 버전을 확인하는 몇 가지 간단한 다른 방법이 있습니까?

+3

NET_2_0, NET_3_5 등의 정수는 어디에서 왔습니까? Mono docs에서는 많은 참고 문헌을 찾을 수 있지만 microsoft.com에서는 아무 것도 없습니다. –

+0

Tom, csproj 파일을 검사하여 표준 Microsoft 프로그램이 아닌 다른 포함 또는 대상이 있는지 확인 했습니까? 이 프로젝트에 포함 된 사용자 정의 빌드 기능 일 수 있습니다. –

답변

3

사용자가 말하는 NET_x_y 버전 번호는 공식 사양의 일부가 아니므로 Microsoft에서 중단 한 것으로 보입니다.

+0

음,이 경우 일 수 있습니다. 내가 인터넷 검색을 할 때 나는 그들에 대한 언급을 거의 찾을 수 없었다. 어쩌면 내 프로젝트의 이전 개발자가이 문제를 발견했을 때까지 지금까지 성공했습니다. –

+0

또한 플래그는 Visual Studio에서 컴파일러에 대한 명령 줄 인수를 통해 설정하는 데 사용됩니다. 그것은 컴파일러 자체에 의해 설정되지 않았습니다. 빌드 방법론을 NAnt 또는 유사하게 변경하면 Visual Studio의 동작을 에뮬레이션해야하기 때문에 위험합니다. –

+0

우리가 이걸 벗어날 필요가있는 것 같습니다. 감사! –

0

Environment.Version의 문제점은 무엇입니까?

+0

그는 컴파일 타임에 환경 특정 기능을 사용할 가능성이 높습니다. 즉, 특정 프레임 워크에 존재하지 않는 메소드를 호출합니다. 런타임에이를 수행하려면 리플렉션을 사용해야합니다. –

+0

David, 제 프로젝트에서 이러한 용도로 자주 사용했습니다. –

+0

또한 "유감스럽게도이 말은 .NET Framework 버전이 아니라 .NET CLR (런타임 라이브러리) 버전입니다.이 두 버전 번호는 항상 동일하지는 않지만 특히 .NET Framework 3.0과 3.5 둘 다 사용합니다 .NET CLR 2.0. " 경유 : http://stackoverflow.com/questions/37468/how-to-determine-the-installed-asp-net-version-of-host-from-a-web-page/37530#37530 –

0
Assembly.ImageRuntimeVersion 

는 어셈블리에 대해 컴파일 된 런타임 버전이 포함되어 있습니다, 그래서 당신은 모든 처리기 지시어로 수행하는 못생긴 해킹 필요가 없다.

+0

Foxfire, 내 프로젝트의 설명서 http://msdn.microsoft.com/en-us/library/system.reflection.assembly.imageruntimeversion에 대한 링크가 포함되어 있습니다.aspx 메모가 들어 있습니다. 기본적으로 ImageRuntimeVersion은 어셈블리를 만드는 데 사용되는 CLR 버전으로 설정됩니다. 그러나 컴파일 타임에 다른 값으로 설정되었을 수 있습니다. 나는 이것이 틀린 것일 수도 있지만, 왜 우리가 다른 방식으로 버전을 얻으 려했는지 이유 중 하나라고 생각합니다. 다른 이유는 특정 버전에만 존재하는 메서드를 사용하는 함수를 조건부로 컴파일하기위한 이유입니다. –

+0

참고 : .NET Framework 1.0에서는 Assembly.ImageRuntimeVersion 속성을 사용할 수 없습니다. 이 프로젝트에 참여한 사람은 여전히 ​​1.0을 사용하고 있다고 생각하지 않습니다 ... 또는 우리는 여전히 공식적으로 지원합니다 ... –