.NET6アプリからUWPのAPI(WinRT API)を使う

tera1707.com

やりたいこと

以前、.net frameworkで、UWPのAPIを使うやり方を調べたが、同じことを.NET6でもやりたい。

やり方

.NET6のプロジェクトの対象WIndowsのバージョンを、Windows 10, version 1809にしてやる。

csprojの中の<TargetFramework>を下記のようにすることで、バージョンを指定できる。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0-windows10.0.17763.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

MS公式ページによると、下記のWindowsバージョンを指定すればUwpのAPIが使える様子。(22/03/16時点)

Windowsバージョン TargetFrameworkの値
Windows 10, version 1809 net5.0-windows10.0.17763.0
Windows 10, version 1903 net5.0-windows10.0.18362.0
Windows 10, version 2004 net5.0-windows10.0.19041.0
Windows 11 net5.0-windows10.0.22000.0

サンプル

var appDataPath = string.Empty;
try
{
    appDataPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
    Console.WriteLine("■UWP版");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
    appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    Console.WriteLine("■Desktop版");
}
Console.WriteLine(appDataPath);

パッケージプロジェクトから実行

f:id:tera1707:20220316223701p:plain

.net6アプリを直接実行

f:id:tera1707:20220316223828p:plain

※パッケージせず、.net6アプリから直接実行したときは、UWPのAPIを呼ぼうとしたときには例外が発生する。
ここでは、代わりに.netのAPIで、AppDataのフォルダを取っている。

メモ

この<TargetFramework>にセットする値のことを、Target Framework Monikerというらしい。

Monikerは「あだ名」なので、ターゲットにするフレームワークのあだ名、ということか。

本名が「1809」とかの数字なのか?本名で呼べばいいのに。また、あだ名多すぎて覚えられないので、本名でもあだ名(Moniker)でもどっちでもいいから統一してほしいと思った。

注意

すべてのUWP APIが、デスクトップAppから使えるわけではなさそう。 下記参照。

docs.microsoft.com

参照

そのものズバリのMS公式情報。

docs.microsoft.com

blogs.windows.com