ProgramingTip

.NET 버전 4.5가 현재 코드를 실행하고 있음을 런타임에 감지합니까?

bestdevel 2020. 12. 6. 21:55
반응형

.NET 버전 4.5가 현재 코드를 실행하고 있음을 런타임에 감지합니까?


.NET 4.0 버전을 '대체'하는 http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=27541 에서 .NET 4.5 개발자 미리보기를 설치했습니다 .

그러나 .NET 프레임 워크 버전을 감지하는 이전 방법은 4.5 (아마도 이전 버전과의 새로운 버전을 확실 함) 대신 4.0 (더 정확하게는 내 PC에서 4.0.30319.17020)을 반환하는 것입니다.

using System;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var version = Environment.Version;
            Console.WriteLine(version.ToString());
            Console.ReadKey();
        }
    }
}

내 코드가 실제로 .NET 4.5에서 실행 실행 수신 감지?


CLR (예 : "런타임")과 프레임 워크 라이브러리 (예 : "프레임 워크")를 명확하게 구분해야합니다. 첫 번째 또는 첫 번째 코드를 실행하면 코드가 실행되고 나중에 사용됩니다. 불행히도 ".NET 버전 " 이라는 용어를 사용할 때 하나는 일반적으로 말한대로 다를 수있는 인적 버전에 관계없이 런타임과 프레임 워크의 전체 패키지를 의미합니다.

강력한 프레임 워크 버전을 감지 할 수 있습니다 . 어떤 것을 사용하고 있는지 알려주었습니다.

4.5에있어서 잘 모르겠지만 2.0 대 3.0 또는 3.5 Environment.Version에서는 모든 프레임 버전이 CLR 2.0을 사용하기 때문에 항상 2.0을 반환하므로 도움이되지 않습니다. 프레임 워크 4.5에서 CLR 버전이 여전히 4.0 이라고 가정 합니다 .이 경우에도 4.0.x 반환합니다.Environment.Version

사용자에게있는 기술은 특정 .NET 프레임 워크 버전부터 만 존재한다는 것을 알고있는 핵심 라이브러리 (mscorlib, System.Core 등)의 유형, 메소드 또는 속성을 확인하는 것입니다.

예를 들어 ReflectionContext 클래스는 .NET Framework 4.5에서 완전히 새로운 것처럼 보이며 편리하게 mscorlib. 그래서 이런 식으로 할 수 있습니다.

  public static bool IsNet45OrNewer()
  {
      // Class "ReflectionContext" exists from .NET 4.5 onwards.
      return Type.GetType("System.Reflection.ReflectionContext", false) != null;
  }

모두 말했듯이, 사용중인 .NET 버전을 알고있는 이유에 대해 의문을 사용할 수 있습니다. 필요한 기능에 액세스하고없는 경우 다른 기능 (이전 버전에서 사용 가능)으로 대체 사용합니다.

업데이트 : .NET 4.5라는 용어는 기본 클래스 라이브러리 (BCL) 등 (총칭하여 "프레임 워크"라고 함)과 실행 자체 (예 : CLR)를 구성하는 여러 어셈블리의 전체 패키지를 나타냅니다. 말했듯이 다른 버전.

저는 Microsoft에서 일하지 실제 ".NET 프레임 워크 버전"을 포함합니다 (단일) 함수 또는 API가없는 이유에 전혀 알지 못합니다.

  1. 특히 대표적인 함수 / API가 제공해야하는 정보가 명확하지 않습니다. BCL의 식별 어셈블리조차도 공통 (어셈블리 / 파일) 버전을 공유하지 않습니다. 예를 들어 .NET 3.0 및 3.5에서는 mscorlib.dll의 버전이 2.0.x 인 반면 WCF 및 WF의 새 어셈블리에만 3.0이 있습니다. 나는 생각하는 도 .NET 3.5에 System.ServiceModel.dll여전히 존재하는 버전 3.0.x와 내가 말하려는 목적 프레임 워크의 모든 어셈블리에 통합 된 버전이있는 것입니다. 호출 API 호출은 무엇 System.Environment.FrameworkVersion반환해야합니까? 버전은 어떤 값일까요 (4.5와 같은 "기호"버전을 반환 했나요?).

  2. 구체적 너무 임 일부 새로운 기능 현관은 SP에 기존 버전에 추가되어 새 버전 의 일부가 될 수 있습니다 . 기능 검사를 수행하면 애플리케이션 이 업데이트 된 이전 버전에서 완벽하게 실행될 수있는 반면에 명시적인 버전 검사를 사용하면 사용하면 최신 버전으로 제한 할 수 있습니다. 나는 이것에 대한 .NET 세계의 예를 가지고 있지 않지만 일반적으로 (그리고 Windows 자체, 예를 들어 WMI) 그것은 일어날 수 있습니다.

  3. 오늘의 이야기. 현재 응용 프로그램에서 사용중인 "프레임 워크의 버전"파악하는 방법을 이 제공하기에 바람직 하지도 않다고 상상할 수 있습니다. 네이티브 / Win32에서 세계 에는 버전 검사 오류 (.NET에도 적용되는 개념에 대해서는 " 버전 검사 안 함 "단락 참조 ) 길고 불경 한의 역사가 있습니다. 예를 들어, 사람들 은 응용 프로그램을 작성할 때 추론 최신 버전이라고 알고있는 버전을 실행하는 것만 확인함으로써 GetVersionGetVersionExAPI 잘못를 사용했습니다 . 따라서 응용 프로그램이 최신 버전의 Windows에서 실행 가능하다는 기능이 사용하고 있었지만 여전히 거기에 있습니다. Microsoft는 이와 같은 문제를 고려하여 .NET에서 일부 API를 제공하지 않을 수 있습니다.

더 여서 이것은 Microsoft 가 GetVersion 함수의 비고 섹션에서 권장하는 것 입니다.

현재 운영을 제공하는 것이 일반적으로 가장 좋은 방법이 있는지 확인합니다. 이는 운영 환경에 재배포 가능 DLL에 새 기능이 추가 기능 수 있기입니다. GetVersionEx를 사용하여 운영 체계 플랫폼 또는 버전 번호를 확인하는 대신 기능 자체가 있는지 테스트하십시오.

Windows 팀 블로그에도 이에 대해 할 말이 있습니다.

이 모든 것이 Windows 및 기본 프로그래밍에 관한 것이지만 개념과 위험은 .NET 응용 프로그램, 프레임 워크 및 CLR에 대해 동일합니다.

따라서 (안정 우아한) 폴백을 사용할 기능 검사는 애플리케이션이 하위 시스템을 보장하는 훨씬 더 강력한 방법이라고 말하고 싶습니다. 응용 프로그램이 특정 버전의 .NET 이상에서만 작동하는 특별한 작업을 수행하지 말고 .NET 자체의 하위 시스템을 믿으십시오.


응용 프로그램이 실행중인 .NET 패치를 정확히 다음을 호출하여 mscorlib의 빌드 번호를 찾습니다.

System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion

현재 .NET 4.6.1에 해당하는 4.6.1055.0을 반환합니다.


.NET Framework 4.5는 4.0으로의 전체 업그레이드입니다. 이 느슨하게 버전 4.0 또는 4.5 실행 중이고 4.5가 설치되어 있고 확실히 4.5에서 실행임을 의미합니다. 수표는 다음과 같이 진행될 수 있습니다.

4.0 및 4.5 실행 모두 4.0 버전 실행을 호출 해 보겠습니다 .

  1. 4.0 버전 런타임에서 실행 중인지 확인하십시오.

    • 어셈블리가 .NET 4.0을 대상으로 컴파일 된 경우 또는
    • Environment.Version.Major == 4 && Environment.Version.Minor == 0

    그런 다음 4.0 버전 런타임에서 실행 중입니다.

  2. 설치된 버전을 확인하여 4.0 버전 런타임이 실제로 버전 4.0인지 4.5인지 확인합니다.

    • 키 아래에서 값을 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client확인하십시오 _Version_. 시작 "4.0"하면 4.0 런타임에서 "4.5"실행 중이고 시작 하면 4.5 런타임에서 실행 중입니다.

James는 런타임 mscorlib.dll 의 "제품 버전"을 가져 오는 훌륭한 대답제공합니다 .

( using System.Diagnostics;)

FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion

이것은 잘 작동하지만 대신 System.dll 을 검사하여보다 세분화 된 결과를 얻을 수 있습니다 .

FileVersionInfo.GetVersionInfo(typeof(Uri).Assembly.Location).ProductVersion

전자가 후자 아니라 에서 정의되기 때문에 typeof(Uri)대신에 어셈블리를 사용하는 것이 약간의 차이가 있습니다 . .NET 4.7.1을 대상으로하는 간단한 C # 콘솔 프로그램의 경우 현재 내 시스템에보고 된 차이점은 다음과 같습니다 .typeof(int)System.dllmscorlib.dll

... \ Microsoft.NET \ Framework \ v4.0.30319 \ mscorlib.dll 4.7. 2600 .0 ... \ Microsoft.NET \ Framework \ v4.0.30319 \ System.dll 4.7. 2556 .0

구분이 유용한 지 또는 더 자세한 정보를 사용하는 방법은 특정 상황에 따라 다릅니다.


당신은 여부를 테스트 할 수 있습니다 .NET 프레임 워크 4.5 또는 .NET 프레임 워크 4 당좌으로 설치되는 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FullA의 레지스트리 하위 키 DWORD의 이름 값을 Release. 이것의 존재는 .NET Framework 4.5 가 해당 컴퓨터에 설치 DWORD되었음을 나타냅니다 . 의 값은 버전 번호입니다. .NET Framework 4.5 의 최종 릴리스 버전 이 설치되어 있는지 확인 하려면 .NET Framework 보다 크거나 같은 값을 확인하십시오 .Release378389


온라인 리소스에서 이해 한 바에 따르면 .NET 4.5는 2.0에서 3.5와 비슷한 방식으로 (완전히 동일하지는 않지만) 작동합니다. 버전 번호는 동일하게 유지됩니다 (3.5 코드를 실행하면 CLR 버전은 2.0이됩니다). 기존 CLR 4.0의 업데이트 역할을합니다.

따라서 공존하는 2.0을 3.5로 업그레이드하고 4.0을 4.5로 업그레이드 할 수 있습니다.

아직 명확하지 않은 것은 4.5로 업그레이드하지 않고도 4.0에서 프로젝트를 만들거나 기존 프로젝트에서 작업 할 수 있는지 여부입니다. 현재 Visual Studio 2010에서 2.0 또는 3.5 프로젝트를 만들 수 있지만 같지 않을 수도 있습니다. 4.0 및 4.5.

참고 URL : https://stackoverflow.com/questions/8517159/how-do-i-detect-at-runtime-that-net-version-4-5-is-currently-running-your-code

반응형