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);
這樣就搞定啦!