Windows Runtime API是當初某軟為了區別Win32 API,力挺UWP而建立的另一套Windows 10專用的API集合。後來因為一些原因,UWP沒火。為了不埋沒很有價值的Windows Runtime API,某軟只好允許.NET Framework的程式呼叫Windows Runtime API,我們在《遷移桌面程式到MS Store(4)——桌面程式呼叫Win10 API》中討論過。
而從.NET 5開始,新.NET中Desktop App呼叫WinRT runtime的方式又發生了變化。總體來說更簡單了,今天我們就一起來實踐一番。
首先我們建立一個新的Console工程。Framework選擇.NET 6。除了學習性質的個人專案,否則我只推薦Long-term support的版本,商業性質的專案發布出去以後,突然對應版本的.NET Runtime官方支援週期到了,是比較滑稽的。
在這樣一個Console的程式中,我打算存取一個常見的WinRT API:Windows.Devices.Raidos名稱空間下的Radio類。當然我們也可以通過Win32 API去操作藍芽,可如果僅希望開、關和查詢藍芽狀態這樣的簡單操作,Win32 API就顯得有些蛋疼了。
而Radio類對.NET 程式而言,就顯得友好許多。首先讓我們右鍵編輯project檔案。
將預設的:
<TargetFramework>net6.0</TargetFramework>
更改為對應具體Windows SDK版本:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0-windows10.0.22000.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project>
其中SDK版本的對應關係如下:
• net6.0-windows10.0.17763.0: 對應 Windows 10, version 1809.
• net6.0-windows10.0.18362.0: 對應 Windows 10, version 1903.
• net6.0-windows10.0.19041.0: 對應 Windows 10, version 2004.
• net6.0-windows10.0.22000.0: 對應 Windows 11.
完成這一步之後,即可像UWP程式裡一樣,通過using添Windows.Devices.Raidos名稱空間,來直接使用WinRT API了。
using Windows.Devices.Radios; // See https://aka.ms/new-console-template for more information Console.WriteLine("Hello, World!"); foreach (var radio in await Radio.GetRadiosAsync()) { Console.WriteLine($"Name:{radio.Name}, Kind:{radio.Kind}, State:{radio.State}"); } Console.ReadLine();
是不是又一次覺得啊軟這回能Make desktop great again!這個現在還不好說,但學習一下如何開發現代化的Desktop App總不是壞事。
附上Github連結:
manupstairs/WinRTApiInNet6: Introduce how to use WinRT API in .NET 6 project. (github.com)
以下連結,是MS Learn上Windows開發的入門課程,單個課程三十分鐘到60分鐘不等,想要補充基礎知識的同學點這裡:
開始使用 Visual Studio 開發 Windows 10 應用