rksoftware

Visual Studio とか C# とかが好きです

RDP での WPF ハードウェア アクセラレーション

皆さん .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 でのハードウェア アクセラレーション、効くのでしょうがどう確認しましょうか......?