VC++ で NuGet パッケージ更新ができない、winrt/base.h が見つからない場合の対処

Page content

NuGet でパッケージをインストールしてビルドすると、 所定のディレクトリにヘッダファイルが生成されるが、 そのヘッダファイルが生成されない、あるいは更新されなくなることがある。

今回のネタは、この状態を解消する方法について。

エラーの解消

エラーの症状は幾つかあるが、だいたいは次のいずれか。

  • winrt/base.h が見つからない。 (base.h に限らず winrt/ 以下のファイルが見つからない)
  • NuGet でインストールしたパッケージが見つからない
  • NuGet でインストールしたパッケージのバージョンが意図したバージョンと異なる

この現象の対処のとして、公式の HP には以下の情報がある。

<https://learn.microsoft.com/ja-jp/nuget/consume-packages/package-restore-troubleshooting>

しかし、残念ながらこれでは上手くいかないケースがあった。

ではどうするか?

プロジェクト.vcxproj 内に記載されている import エレメント <Import Project="" /> において、 問題が発生しているパッケージのエレメントを削除する。

なお、パッケージのバージョンの更新などを行なっているとその情報も入っているので、 それも含めて削除する。 削除後、 visual studio でプロジェクトを開きなおす。 そして、 NuGet マネージャで使用したいパッケージをインストールしなおす。

パッケージのバージョンを切り替えているのに切り替わらない場合

  • 一旦所望のバージョンとは異なるバージョンのパッケージをインストールする。
  • そしてインストールした後で、ビルドを行なう。
  • 次に、 "プロジェクト.vcxproj" から当該のバージョンの情報を削除する。
  • そして所望のバージョンのパッケージをインストールする。
  • この後にビルドを行なう。

これによって、切り替えた後のバージョンで winrt 以下が更新される。

まとめると、以下が重要。

これを行なうと強制的にパッケージの更新が行なわれる。

  • "プロジェクト.vcxproj" から <Import Project="" /> を削除する
  • NuGet マネージャでパッケージをインストール
  • ビルド