Windows 10 UWP 38 of N: Desktop bridge 在 Win32的應用程式中使用 WinRT API

  • 283
  • 0
  • UAP
  • 2021-04-30

介紹如何使用 .NET Framework, .NET Core 和 .NET 5 如何使用 WinRT API

早在 Windows 8 的時候就有開始加入Windows Runtime的概念,然而到UWP才開始讓整體應用程式比較能夠跨裝置或跨OS的方式來實作。目前已經有很多種方式存取 WinRT 的 API 了,這邊做個總整理!

開發環境

  • Windows 10 20H2
  • Visual Studio 2019
  • Windows 10 SDK latest ( 10.0.19041.* )

專案類型是 .NET Framework 以及 .NET Core

在的 .NET Framework / .NET Core 上使用可以兩種不同的方式存取 WinRT API

  1.  Nuget package
  2. Assembly reference

先來說如何加入 Assembly reference 好了,因為這種方式可以讓開發人員針對更多舊版本的OS進行支援! 重點是要將兩個檔案參考到現行的參考中,分別如下

  • Windows.winmd
  • System.Runtime.WindowsRuntime.dll

而 Windows.winmd的路徑取決在安裝的 Windows 10 SDK!如果有裝越多版本的就可以支援到越舊的OS版本,路徑如下

C:\Program Files (x86)\Windows Kits\10\UnionMetadata\{ Windows 10 SDK version }\Windows.winmd

檔案路徑裡面的 Windows 10 SDK version就是如下表

10.0.10240.*
10.0.10586.*
10.0.14393.*
10.0.15063.*
10.0.16299.*
10.0.17134.*
10.0.17763.*
10.0.18362.*
10.0.19041.*

目前有正式支援的 Windows 10 SDK 版本主要有這幾版號,但是因為 Visual Studio 2019 現在只會列出 16299以上的版本,如果有些開發人員需要支援較舊版本的 Windows 10 卻需要使用 WinRT API 那就需要自行安裝了!安裝舊版 Windows 10 SDK 的連結在這 

Windows SDK and emulator archive )

然後另外一個 System.Runtime.WindowsRuntime.dll的路徑如下

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll

將兩個參考加入到專案中就可以存取 WinRT API 了! 如下圖使用 .NET Framework WPF 專案

這樣就可以在 C# WPF ( .NET Framework ) 中使用Windows Runtime API

接著另外一種方式是加入 nuget package的方式!使用Visual studio 對專案右鍵的 nuget package 尋找

Microsoft.Windows.SDK.Contracts
比較需要注意是這個套件必須是 .NET Framework 4.5 + 或 .NET Core 3.0+,且支援的版本也只有從 17134以上的OS支援。

然後再 .NET 5的部分有了很大的調整! 由於從 .NET 5.0開始是把 .NET Framework, .NET Core, Mono 整併起來的第一個版本。所以也算是開啟了合併框架層的第一步! 而在 .NET Core延續下來的 csproj 新格式讓編輯專案細項項目變得非常方便,而在 .NET5.0也有針對 OS的 TargetFramework,這邊要是使用 Windows Runtime API 就直接修改一下 TFM ( TargetFramework Moniker ) 目前有支援從 .NET5.0 修改 TargetFramework來使用 Windows Runtime API的版本如下

10.0.17763.0
10.0.18362.0
10.0.19041.0

直接修改 csproj 幾個部份讓 .NET5.0能夠使用 Windows Runtime API,以下是使用 WPF

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

	<PropertyGroup>
		<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>
		<UseWPF>true</UseWPF>
		<OutputType>WinExe</OutputType>
	</PropertyGroup>

</Project>

以下是使用 Windows Forms

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

	<PropertyGroup>
		<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>
		<UseWindowsForms>true</UseWindowsForms>
		<OutputType>WinExe</OutputType>
	</PropertyGroup>

</Project>

重點是要用 WindowsDesktop 的 Sdk 然後修改 TargetFramework 最後再看看要使用 WPF or WindowsForms 這兩個框架或是不使用。 下圖是使用WPF配合 .NET 5.0 以及修改TFM的DEMO

可以參考此連結 ( Calling Windows APIs in .NET5 - Windows Developer Blog ) 以及這個連結 ( Call Windows Runtime APIs in desktop apps - Windows applications | Microsoft Docs ) 有更多詳細的解釋。

 

***以上Code以及說明都有可能隨著Windows 10 的版本以及Visual Studio 版本有所調整!***

參考資料 Microsoft Docs,Windows Blogs for developer

下次再分享Windows 10 的新技術拉~