資産ファイル'C:\path\to\project.assets.json' が見つかりません。

資産ファイル'C:\path\to\project.assets.json' が見つかりません。

はじめに

既に Microsoft Storte に公開しているアプリケーションを、更新する過程でつまづいたことを備忘録として記述していきます。

同じような事象で悩んでいる人の助けになれば幸いです。

問題の事象

初回リリース時のことは正直覚えていませんが、アプリケーションのビルドをx86からx64に変更しました。(※x86とx64の違いについてはこちらのページを参考にしてください)

プロジェクトのビルドで、プラットフォームターゲットをx64に変更したことで発生しました(多分…

プラットフォームターゲット

この状態でアプリケーションパッケージプロジェクトから「アプリケーションパッケージの作成」を実行すると、

image2

image3

image4

image5

画像のようにproject.assets.jsonが無いというエラーでビルドが停止します。

これはバグか何なのか不明ですが、x86ではそのような事象は発生しなかったと記憶しています(多分…

そして、MSIX パッケージが似非 64 ビットになる件の記事を参考にこの問題を解決しました(ありがとうございます!

手順としては、大元となるプロジェクト(クラスライブラリなどではなくWPFプロジェクト)内のbinobjフォルダを一旦削除します。

image6

image7

image8

その後、Releaseビルドとx64ビルドに変更しビルドします。

imag9

imag10

そうすると以下のようなファイルが作成されます。

imag11

これらのファイルをMSIX パッケージが似非 64 ビットになる件を参考に手動で移動してもよいのですが、プロジェクト内に以下の記述を追加して、アプリケーションパッケージ化をした際に自動で指定のフォルダにコピーされるようにします。

"ZahyoKun.csproj"
<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net8.0-windows10.0.22621.0</TargetFramework>
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
        <UseWPF>true</UseWPF>
        <UseWindowsForms>true</UseWindowsForms>
        <PlatformTarget>x64</PlatformTarget>
        <ApplicationIcon>icon.ico</ApplicationIcon>
    </PropertyGroup>

    <ItemGroup>
        <None Remove="nlog.config" />
    </ItemGroup>

    <ItemGroup>
      <Content Include="icon.ico" />
    </ItemGroup>

    <ItemGroup>
        <EmbeddedResource Include="nlog.config">
            <CopyToOutputDirectory>Never</CopyToOutputDirectory>
        </EmbeddedResource>
    </ItemGroup>

    <ItemGroup>
        <PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
        <PackageReference Include="MahApps.Metro" Version="2.4.10" />
        <PackageReference Include="MaterialDesignColors" Version="5.2.1" />
        <PackageReference Include="MaterialDesignThemes" Version="5.2.0" />
        <PackageReference Include="MaterialDesignThemes.MahApps" Version="5.2.0" />
        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.3" />
        <PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.135" />
        <PackageReference Include="NLog" Version="5.4.0" />
        <PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
    </ItemGroup>

    <ItemGroup>
        <ProjectReference Include="..\ZahyoKun.Domain\ZahyoKun.Domain.csproj" />
        <ProjectReference Include="..\ZahyoKun.Infrastructure\ZahyoKun.Infrastructure.csproj" />
    </ItemGroup>

+   <!-- MSIXパッケージ作成時のproject.assets.json自動コピー -->
+   <Target Name="EnsureProjectAssetsForWapPublish" BeforeTargets="GetPackagingOutputs">
+       <PropertyGroup>
+           <ProjectAssetsJsonSource>$(MSBuildProjectDirectory)\obj\project.assets.json</ProjectAssetsJsonSource>
+           <WapPublishDir>$(MSBuildProjectDirectory)\obj\wappublish\$(RuntimeIdentifier)</WapPublishDir>
+       </PropertyGroup>

+       <MakeDir Directories="$(WapPublishDir)" Condition="!Exists('$(WapPublishDir)')" />

+       <Copy SourceFiles="$(ProjectAssetsJsonSource)" DestinationFolder="$(WapPublishDir)" Condition="Exists('$(ProjectAssetsJsonSource)')" />

+       <!-- 他の必要ファイルもコピー -->
+       <ItemGroup>
+           <ObjFiles Include="$(MSBuildProjectDirectory)\obj\*.deps.json" />
+           <ObjFiles Include="$(MSBuildProjectDirectory)\obj\*.cache" />
+           <ObjFiles Include="$(MSBuildProjectDirectory)\obj\*.nuget.dgspec.json" />
+           <ObjFiles Include="$(MSBuildProjectDirectory)\obj\*.nuget.g.props" />
+           <ObjFiles Include="$(MSBuildProjectDirectory)\obj\*.nuget.g.targets" />
+       </ItemGroup>

+       <Copy SourceFiles="@(ObjFiles)" DestinationFolder="$(WapPublishDir)" Condition="Exists('%(FullPath)')" />
+   </Target>

</Project>

.csprojに追記する記述で以下の作業を自動化しています。

間違いを防止するために、いったん、本体プロジェクトの bin フォルダー・obj フォルダーを削除します。

Releasex64本体プロジェクトのプロパティーで Platform Target が x64 になっていることを確認したうえで、Release | x64 で本体プロジェクトをビルドします。

objobj フォルダーに project.assets.json を含む 5 つのファイルが作成されます。obj フォルダーの中に wappublish フォルダーを作成し、さらにその中に win-x64 フォルダーを作成します。

作成した win-x64 の中に、project.assets.json を含む 5 つのファイルをコピーします(project.assets.json だけでもいいのかもしれませんが)。

ここまでの作業でアプリケーションパッケージ化のビルドもエラーなく通ると思います。

imag12

あとはMicrosoftパートナーセンターより座標くん_1.1.2.0_x64_bundle.msixuploadをアップロードして申請すればOKです。

imag13

さいごに

興味のある方は座標くんをインストールしてみてください!