皆さん .NET 8 RC1 を使い始めていると思います。私も使い始めています。
そんな .NET 8 RC1 に気になる項目があります。「 RDP での WPF ハードウェア アクセラレーション 」です。
devblogs.microsoft.com
これは、リモートデスクトップでアプリを使っているときに ハードウェア アクセラレーション が有効になるという素敵機能です。Virtual Desktop やリモートワークなどで活用の機会もおおいのではないでしょうか?
見てみましょう。
■ *.runtimeconfig.json
記事を読んでみると、*.runtimeconfig.json
ファイルに次の要素があれば良さそうです。
"configProperties": {
"Switch.System.Windows.Media.EnableHardwareAccelerationInRdp": true
}
*.runtimeconfig.json
はビルド結果のファイルにあります。こんな感じ。

{
"runtimeOptions": {
"tfm": "net8.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0-rc.1.23419.4"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "8.0.0-rc.1.23420.5"
}
],
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true
}
}
}
要素を追加するための方法は 2 種類ある様子。一つ目は *.csproj
に要素を追加する方法、二つ目は runtimeconfig.template.json
ファイルに要素を追加する方法。
やってみましょう。
■ Visual Studio で WPF アプリを作る
今更気にすることもないことですが、Visual Studio で WPF アプリを作るとき、テンプレートが二つあるので間違えないようにしてください。

選ぶのは 「 WPF アプリケーション 」です。もう一つを選ぶと、この令和の時代に .NET Framework になってしまいます。
今回は 3 つのアプリを作って試してみます。
■ *.csproj
に要素を追加するパターン
<ItemGroup>
<RuntimeHostConfigurationOption Include="Switch.System.Windows.Media.EnableHardwareAccelerationInRdp" Value="true" />
</ItemGroup>
という要素を追加するとのことです。
追加する場所は <Project Sdk="Microsoft.NET.Sdk">
の配下で、こんな感じになります。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<RuntimeHostConfigurationOption Include="Switch.System.Windows.Media.EnableHardwareAccelerationInRdp" Value="true" />
</ItemGroup>
</Project>
誤った場所に追加するとプロジェクトが開けなくなります。例えばこんな風に間違えると
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
<ItemGroup>
<RuntimeHostConfigurationOption Include="Switch.System.Windows.Media.EnableHardwareAccelerationInRdp" Value="true" />
</ItemGroup>
</PropertyGroup>
</Project>

こんな感じです。
■ *.csproj
に要素を追加するパターン
プロジェクトのフォルダのトップ ( *.csproj
がある場所) に runtimeconfig.template.json
ファイルを作ります。
{
"configProperties": {
"Switch.System.Windows.Media.EnableHardwareAccelerationInRdp": true
}
}
ここに書いた要素が、ビルドの出力フォルダーの先述の何もしていない *.runtimeconfig.json
と合成されます。
■ 3 つのアプリ
ということで、
- 何もしていないアプリ
*.csproj
に要素を追加したアプリ
runtimeconfig.template.json
を追加したアプリ
の 3 つができました。こんな感じです。

■ 3 つの *.runtimeconfig.json
ファイル
それぞれの *.runtimeconfig.json
ファイルは次のようになりました。
何もしていないアプリ
{
"runtimeOptions": {
"tfm": "net8.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0-rc.1.23419.4"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "8.0.0-rc.1.23420.5"
}
],
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true
}
}
}
*.csproj
に要素を追加したアプリ
{
"runtimeOptions": {
"tfm": "net8.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0-rc.1.23419.4"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "8.0.0-rc.1.23420.5"
}
],
"configProperties": {
"Switch.System.Windows.Media.EnableHardwareAccelerationInRdp": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true
}
}
}
runtimeconfig.template.json
を追加したアプリ
{
"runtimeOptions": {
"tfm": "net8.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0-rc.1.23419.4"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "8.0.0-rc.1.23420.5"
}
],
"configProperties": {
"Switch.System.Windows.Media.EnableHardwareAccelerationInRdp": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true
}
}
}
計画通り。要素の追加された *.runtimeconfig.json
が出来上がりました。
*.csproj
に要素を追加したアプリと runtimeconfig.template.json
を追加したアプリで同じものになりました。
■ 試してみたい
実行してみます。

何もわからない......。RDP でのハードウェア アクセラレーション、効くのでしょうがどう確認しましょうか......?