もくじ
https://tera1707.com/entry/2022/02/06/144447#WinUI3
やりたいこと
先日、WinUI3製のアクリル見た目を調整するアプリを作った。
これを、まっさらインストールしたてのWindows11で動かすと、下記のような、WindowsAppRuntimeが足りない旨エラーが出てしまった。
ネットにつながるPCなら、ここで「はい」を押すと、下記のダウンロードページに飛ぶのだが、
https://docs.microsoft.com/en-us/windows/apps/windows-app-sdk/downloads
ダウンロードせずに、作ったアプリに動くもの全部を入れて、まっさらWindowsでも動くようにしたい。
前提
- Windows11 Home 21H2 22000.795
- VisualStudio2022 Community 17.1.4
- WinUI3.0
- Windows App SDK 1.1
- 2022年7月の時点の調査
やりかた
アプリのプロジェクトの設定に、下記を入れる。
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
これをcsprojに書くと、必要なランタイム類がビルドの出力先に一緒に入ってくれた。
また、まっさらWindows11で実行したときに、エラーなく動いてくれるようになった。
※MSの公式ページがいうところの
- 「フレームワーク依存」
⇒今回引っかかったような、動くかどうかがそのPCに必要なものがインストールされてるかどうかに依存するということ - 「自己完結型」
⇒そのPCに必要なものがインストールされていなくても動作可能
ということっぽい。
実験
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
のあり/なしで、出力されるものがどうかわるかを実験した。
WindowsAppSDKSelfContained なし と あり で比較
ファイル数が多いので全部をここに書けないが、下記のようなイメージで、ランタイム関連のファイルのありなしで違いが出ていた。
左:WindowsAppSDKSelfContained なし 右:WindowsAppSDKSelfContained あり
Self-Contained なし と あり で比較
これと似た設定項目で、
<SelfContained>true</SelfContained>
というのがある。→以前調べた記事。
以前調べたときは、SelfContainedをtrueにするしないで、ビルド時の出力物が変わってたのだが、なぜか今回試した限りでは、
<SelfContained>true</SelfContained> <WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
と
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
は、出力される内容が同じだった。
さらに、
<SelfContained>true</SelfContained>
と
※SelfContained と WindowsAppSDKSelfContained の両方無し
は、同じ出力物だった。
以前調べた結果とどうして違うのかは不明。
(以前:.NET6のコード、 今回:.NET6+WinUI3、の違い??)
参考までに、今回実験に使ったcsprojを上げておく。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework> <TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion> <RootNamespace>WinUI3Blur</RootNamespace> <ApplicationManifest>app.manifest</ApplicationManifest> <Platforms>x64</Platforms> <RuntimeIdentifiers>win10-x64</RuntimeIdentifiers> <RuntimeIdentifier>win10-x64</RuntimeIdentifier> <UseWinUI>true</UseWinUI> <WindowsPackageType>None</WindowsPackageType> <SelfContained>false</SelfContained> <WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.WindowsAppSDK" Version="1.1.2" /> <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.1" /> <Manifest Include="$(ApplicationManifest)" /> </ItemGroup> </Project>
参考:dotnet publish には、WindowsAppSDK1.1時点では対応してない
個人的に、.NET6で実装するときには、VisualStudioのGUIでビルドをしなくてもいいようにバッチにdotnet publish
でビルドできるようにしておきたいのだが、WinUI3(というか、WindowsAppSDK)が、1.1の時点ではまだdotnet publish
に対応してないらしい。
⇒以前、dotnet publishのやり方を調べた記事はこちら。
仕方ないので、今回はMSBuild
を実行することで対応した。
参考:WIndows App SDKのアンインストール方法
本件の動作を確認するために、いっぺんSDKをアンインストールしたい。
参考
自己完結型のアプリの配置方法
自己完結型のWinUI 3アプリケーションを作成する
https://www.ipentec.com/document/csharp-winui3-create-self-contained-executables-application