C#でWinRT APIを呼び出す

# 環境
Windows 11 Pro (64bit)
Visual Studio Community 2022

# 参考

https://qiita.com/7shi/items/dc21a3be8b7c69fbc11b

# Visual Studio 2022
C# コンソールアプリ
プロジェクト名：ConsoleApp1
フレームワーク：.NET 8.0
☑最上位レベルのステートメントを使用しない

プロジェクト→プロジェクトファイルの編集
変更前：`<TargetFramework>net8.0</TargetFramework>`
変更後：`<TargetFramework>net6.0-windows10.0.22000.0</TargetFramework>`

https://learn.microsoft.com/ja-jp/windows/apps/desktop/modernize/desktop-to-uwp-enhance

```Program.cs
using Windows.Media.Core;
using Windows.Media.Playback;
using Windows.Media.SpeechSynthesis;

namespace ConsoleApp1
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            var text = "こんにちは、世界";
            var synth = new SpeechSynthesizer();
            var stream = await synth.SynthesizeTextToStreamAsync(text);
            var player = new MediaPlayer();
            player.Source = MediaSource.CreateFromStream(
                stream, stream.ContentType);
            var tcs = new TaskCompletionSource<int>();
            player.MediaEnded += (sender, e) => tcs.SetResult(0);
            player.Play();
            await tcs.Task;
        }
    }
}
```

# dotnetコマンド
適当なプロジェクト名のディレクトリを用意する。
例：`C:\Projects\.NET\SpHello`

```dev.bat
@echo off
prompt $e[33m$p$g$e[m
cmd
```

```
dotnet new console
```

というコマンドで`(プロジェクト名).csproj`と`Program.cs`ファイルが作られる。

```SpHello.csproj
<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>
```

```Program.cs
using Windows.Media.Core;
using Windows.Media.Playback;
using Windows.Media.SpeechSynthesis;

namespace ConsoleApp1
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            var text = "こんにちは、世界";
            var synth = new SpeechSynthesizer();
            var stream = await synth.SynthesizeTextToStreamAsync(text);
            var player = new MediaPlayer();
            player.Source = MediaSource.CreateFromStream(
                stream, stream.ContentType);
            var tcs = new TaskCompletionSource<int>();
            player.MediaEnded += (sender, e) => tcs.SetResult(0);
            player.Play();
            await tcs.Task;
        }
    }
}
```

```
dotnet build
```

というコマンドで"`bin\Debug\net6.0-windows10.0.22000.0\SpHello.exe`が作られる。

# Visual Studio 2022 (.NET Framework)
C# コンソールアプリ (.NET Framework)
プロジェクト名：ConsoleApp2
フレームワーク：.NET Framework 4.7.2

[ツール]->[NuGetパッケージマネージャー]->[パッケージマネージャー設定]
既定のパッケージ管理形式：PackageReference

[プロジェクト]->[NuGetパッケージの管理]
[参照]タブで`Microsoft.Windows.SDK.Contracts`を検索してインストール。
例：`最新の安定板 10.0.22621.3233`

https://learn.microsoft.com/ja-jp/windows/apps/desktop/modernize/desktop-to-uwp-enhance

```Program.cs
using System;
using System.Threading.Tasks;
using Windows.Media.Core;
using Windows.Media.Playback;
using Windows.Media.SpeechSynthesis;

namespace ConsoleApp2
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            var text = "こんにちは、世界";
            var synth = new SpeechSynthesizer();
            var stream = await synth.SynthesizeTextToStreamAsync(text);
            var player = new MediaPlayer();
            player.Source = MediaSource.CreateFromStream(
                stream, stream.ContentType);
            var tcs = new TaskCompletionSource<int>();
            player.MediaEnded += (sender, e) => tcs.SetResult(0);
            player.Play();
            await tcs.Task;
        }
    }
}
```