[UWP] WinRT 下取得作業系統版本

  • 3415
  • 0
  • 2016-02-15

WinRT 下取得作業系統版本

其實一開始都誤會在 WinRT 的時代要使用 .NET 內建的 Environment.OSVersion 已經是不可能,之前查了好久都沒有發現好的取法

因為開始在動 UWP 的東西,才再去找找看有沒有得取得 OSVersion 的 API,找了一陣子看到了這個
What’s new for developers in Windows 10
可以往下找到 System Service 的地方,其中有一個部分就是在講 Version ,看了右邊的說明才驚覺原來其實是可以用 Win32 API 去取得 OSVersion!!OH MY GOD~~~~~~ (而且是 8.1 就可以用了喔!揪瞇!)

這個 GetVersionEx 的 API 縮然已經被標示為 deprecated 不過仍然可以用的,雖然右邊的說明不建議,不過它說的是如果你是要 判斷 版本的話,就改用 VersionHelper 提供的 function 去判斷,還好我只是用來取得而已,所以OK的!

這下就是要找怎麼去把它 wrapper 成 C# ,這個相對容易許多
請參考 這篇 那些 code 就直接複製過來用就好了,避免連結死掉,也把 code 直接貼過來

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
class OSVersionInfo {

public int dwOSVersionInfoSize;
public int dwMajorVersion;
public int dwMinorVersion;
public int dwBuildNumber;
public int dwPlatformId;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public String szCSDVersion;
}

class MainClass {
[DllImport("kernel32.dll")]
public static extern bool GetVersionEx([In, Out] OSVersionInfo osvi);

static void Main(string[] args) {
OSVersionInfo osvi = new OSVersionInfo();
osvi.dwOSVersionInfoSize = Marshal.SizeOf(osvi);

GetVersionEx(osvi);

Console.WriteLine("Class size: " + osvi.dwOSVersionInfoSize);
Console.WriteLine("Major Version: " + osvi.dwMajorVersion);
Console.WriteLine("Minor Version: " + osvi.dwMinorVersion);
Console.WriteLine("Build Number: " + osvi.dwBuildNumber);
Console.WriteLine("Platform Id: " + osvi.dwPlatformId);
Console.WriteLine("CSD Version: " + osvi.szCSDVersion);
Console.WriteLine("Platform: " + Environment.OSVersion.Platform);
Console.WriteLine("Version: " + Environment.OSVersion.Version);

}
}

這真的是… 千金難買早知道 *____*
目前測試在 UWP 跑在 Desktop 是正常的,再來試看看手機行不行

=== 2016/01/07 更新 ===

上面的方法經過測試,在 Windows 10 Mobile (就是手機上)是不能運作的,會跑出 exception XD
不過發現 UWP 有API可以取得資訊,就不用用這種怪怪的方式了!

使用 Windows.System.Profile.AnalyticsInfo 有提供 VersionInfo 的 Property,再取得其中的 DeviceFamilyVersion property 來做處理

string versionString = AnalyticsInfo.VersionInfo.DeviceFamilyVersion;
ulong versionNumber = ulong.Parse(versionString);
ulong major = (versionNumber & 0xFFFF000000000000L) >> 48;
ulong minor = (versionNumber & 0x0000FFFF00000000L) >> 32;
ulong build = (versionNumber & 0x00000000FFFF0000L) >> 16;
ulong revesion = (versionNumber & 0x000000000000FFFFL);

這樣就搞定啦!