WinUI3でSelfContained=trueでビルドすると出るエラー対処

もくじ
https://tera1707.com/entry/2022/02/06/144447#WinUI3

WinUI3でSelfContained=trueでビルドすると出るエラー対処 その1
https://tera1707.com/entry/2022/03/19/000916

WinUI3でSelfContained=trueでビルドすると出るエラー対処 その2
https://tera1707.com/entry/2022/03/19/004221

WinUI3でSelfContained=trueでビルドすると出るエラー対処 その3
https://tera1707.com/entry/2022/03/19/010307

やりたいこと

WinUI3で作ったアプリを動かすときに、PCにランタイム類がインストールされていなくても動くように<SelfContained>true</SelfContained>をcsprojに書きたいが、それを書くと変なエラーが出る。

なんとかしたい。

前提

VisualStudio2022/.NET6/WinUI3

WIinUI3は、WinUI3のプロジェクトと、パッケージプロジェクトの2つを含むテンプレートを使用。

また、今回作るアプリはx64でだけ動けばいいので、構成マネージャーでx64以外のプラットフォームを削除したところからスタートする。

出るエラーとその対処のために試した手順、結果

まず、上記前提の素の状態のcsprojに、<PropertyGroup>の中に<SelfContained>true</SelfContained>を付け足す。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
    <TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
    <RootNamespace>WinUI3PJTest</RootNamespace>
    <ApplicationManifest>app.manifest</ApplicationManifest>
    <Platforms>x64</Platforms>
    <SelfContained>true</SelfContained>  ★★コレ
    <RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
    <UseWinUI>true</UseWinUI>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.WindowsAppSDK" Version="1.0.0" />
    <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22000.194" />
    <Manifest Include="$(ApplicationManifest)" />
  </ItemGroup>
</Project>

この状態でビルドすると、下記のようなエラーが出る。

エラー    NETSDK1031  RuntimeIdentifier を指定せずに自己完結型アプリケーションをビルドおよび公開することはサポートされていません。RuntimeIdentifier を指定するか SelfContained を false に設定する必要があります。

「RuntimeIdentifier を指定せずに」とあるが、<RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>としっかり書かれてるやないか。

ここで、ソリューションの構成マネージャーで削除したx86とかarmとかが書かれたままになってるからいけないのか?と思い、その辺を削除。 <RuntimeIdentifiers>の中身を下記のようにした。

<RuntimeIdentifiers>win10-x64</RuntimeIdentifiers>

この状態でビルドしても、以前同じエラーが出る。

ここで今一度エラーメッセージをよく見ると、「RuntimeIdentifier を指定せずに」とある。 「RuntimeIdentifiers」ではなく「RuntimeIdentifier」と書かれている。「s」がない。

確かに以前、SelfContainedな.NET6アプリの作り方を調べたときは、sのない「RuntimeIdentifier」と書いていた。 なので下記のように書いてビルドしてみる。

<RuntimeIdentifier>win10-x64</RuntimeIdentifier>

そうすると、ビルドが通って、パッケージプロジェクトでデバッグできた。