.NET 6學習筆記(4)——如何在.NET 6的Desktop App中使用Windows Runtime API

2022-10-23 18:00:28

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 應用

開發 Windows 10 應用程式

編寫首個 Windows 10 應用

建立 Windows 10 應用的使用者介面 (UI)

增強 Windows 10 應用的使用者介面

在 Windows 10 應用中實現資料繫結