[148] 在傳統的 Desktop app 裡呼叫 UWP API

[148] 在傳統的 Desktop app 裡呼叫 UWP API

緣起

前陣子有個專案需要在 Windows 10 的環境用程式去控制 Bluetooth(藍牙)Radio 開關。專案初期評估此功能屬低技術門檻,應有現成的 Windows API 可以用。不過,事實證明我太天真了。最後是利用 UWP API 來解決,細節我會另撰文說明,本章主要說如何在 Desktop app 裡呼叫 UWP API。

Desktop app 能夠使用 UWP API 嗎?

答案是肯定的。一直以來,微軟對於軟體開發介面的設計態度是儘可能保持往前相容,這麼做對開發者友善,這是優點。缺點是包袱多,走不快。這方面微軟的「取捨」做得不錯。

不過,不是所有的 UWP API 都能被 Desktop app 使用。至於哪些能用,哪些不能用,微軟的文件有交待。重點在 DualApiPartitionAttribute

DualApiPartitionAttribute

Desktop app 使用 UWP API 前,要先確定該 API 是否有 DualApiPartition 屬性(Attribute),以 Windows.Devices.Radios 的 Radio class 為例,官方文件:

接著,必須確定該 API 不需要呼叫的 Process(行程)具備 Package Identity,簡單講,就是非 Windows Store app 也能使用。如果中意的 UWP API 不能給 Desktop app,別灰心,還有另一個手段—將 Desktop app 轉成 UWP。

去年的 Windows 10 Anniversary Update(10.0.14393.0)推出一項新技術——Desktop Bridge。其中,Desktop App Converter(DAC)可以將 Desktop app 轉換成 UWP app,也就是俱備 UWP app 特質的 Desktop app(我是這麼理解的)。理論上,Desktop app 程式不需要特別修改即可「無縫」轉換成 UWP app,且轉換後即擁有 Package Identity,然後就可以呼叫原本不能使用的 UWP API 了。

先前轉換過 [JUCE] 開發的 Desktop app,程式碼不做修改,大部分功能運作正常。不過,該專案最終還是以 Desktop app 的形式出貨,所以測試不算周延。

如何於 Desktop app 呼叫 UWP API?

知道需要的 UWP API 支援 Desktop app 後,要怎麼使用呢?這篇官方文章有詳盡的解說。分別介紹了 .NET 以及 C++,步驟不算複雜,易消化。.NET 專案也可以考慮使用 UWP for Desktop (UwpDesktop),可透過 NuGet 來安裝,簡化流程。

環境需求與步驟

請先安裝 Windows 10 SDK 。開發工具我試過 Visual Studio 2015/2017,皆可行。

以 .NET(C#) 來呼叫 UWP API 相當直覺:

  1. 把 Windows 10 SDK 內附的 winmd 加入參考,預設路徑如下:
    • C:\Program Files (x86)\Windows Kits\10\UnionMetadata\winmd
  2. 接著把 .NET Core System.WindowsRuntime.dll 加入參考,預設路徑如下:
    • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.WindowsRuntime.dll

這樣就行了。UWP API 用起來與平常使用 .NET class 無異,幾乎是無痛使用。