윈도우즈 버전을 구하는 방법은 Environment.OSVersion 을 이용해서 구할수 있습니다.
하지만 이 방법으로 윈도우즈 버전을 알아내면 문제가 있습니다. 윈도우 버전을 정확하게 구별할 수가 없습니다. Windows 7, 8, 9, 10, 윈도우즈 서버등을 구분을 못하는 문제입니다.
윈도우 버전 구하는 환경변수 Environment.OSVersion
많은 블로그들이 C# 프로그래밍을 통해 운영체제 버전을 얻기 위해 Environment.OSVersion 을 이용하면 된다고 합니다. 그리고 OSVersion에 저장된 문자열을 파싱해서 버전을 구분할 수 있는 함수 샘플을 아래와 같은 형태로 제공하고 있습니다.
public string GetWindowsOSVersion(string versionString)
{
string[] versionParts = versionString.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (versionParts.Length >= 2 && versionParts[0] == "NT")
{
string[] versionNumbers = versionParts[1].Split('.');
if (versionNumbers.Length >= 2)
{
int majorVersion = int.Parse(versionNumbers[0]);
int minorVersion = int.Parse(versionNumbers[1]);
if (majorVersion == 6)
{
switch (minorVersion)
{
case 1:
return "Windows 7";
case 2:
return "Windows 8";
case 3:
return "Windows 8.1";
case 4:
case 5:
return "Windows 10";
default:
return "Unknown Windows Version";
}
}
else if (majorVersion == 10)
{
return "Windows 10";
}
else if (majorVersion == 11)
{
return "Windows 11";
}
else
{
return "Unknown Windows Version";
}
}
else
{
return "Invalid Version Format";
}
}
else
{
return "Invalid Version String";
}
}
하지만, 사실 그냥 환경변수 값을 읽어서는 정확한 윈도우즈 버전을 구별할수없습니다. 윈도우즈 10과 윈도우즈 서버 등이 같은 버전을 리턴하기 때문입니다.
ex) Microsoft Windows 6.2.9200.0
그래서 꼭 다음과 같은 절차를 거쳐야만 정확한 윈도우즈 버전을 구할 수 있습니다.
응용 프로그램 매니페스트 파일 추가
정확한 윈도우즈 버전을 구하기 위해서는 반드시 응용 프로그램 매니페스트 파일을 추가 해야 합니다.
먼저 프로젝트에 새항목을 추가 합니다.
General 항목에서 응용프로그램 매니페스트 파일 유형으로 추가를 하면됩니다.
그리고 해당 파일을 열어보면 자동으로 만들어진 내용들이 많습니다. 그중에 아래와 같은 윈도우즈 버전별로 supportedOS 항목이 있는걸 볼 수 있는데 주석처리가 되어 있습니다. 이 주석을 모두 풀어주세요.
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- 이 응용 프로그램이 테스트되고 함께 작동하도록 설계된 Windows 버전
목록입니다. 해당 요소의 주석 처리를 제거하면 Windows에서
호환 가능성이 가장 큰 환경을 자동으로 선택합니다. -->
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
<!-- Windows 10 -->
//<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
// 주석제거, 다른 윈도우 버전은 제거한 상태임
</application>
</compatibility>
Environment.OSVersion 윈도우 버전을 정확하게 구할수 없는 이유
c#으로 개발한 응용프로그램에 지원하는 운영체제를 명확하게 명시하지 않을 경우, 윈도우즈는 프로그램을 실행할때 대충 운영체제 호환모드로 동작을 시키게 됩니다. 그래서 실제 사용하는 윈도우즈 버전은 윈도우10 이여도 윈도우8 모드로 프로그램이 실행되게 되고, 버전정보를 확인하면 윈도우8로 나오는식입니다.
그렇기 때문에 명시적으로 app.manifest 파일에 지원하는 윈도우즈 버전을 명시해줌으로써 정확한 윈도우 버전을 구해올 수 있게 되는 겁니다. 이렇게 매니페스트 추가까지 해줘야 정확하게 윈도우즈 버전정보를 가져올수 있습니다.