問題の概要
ビルドをクリックし、クリーンなコンパイルを期待していたところ、出力ウィンドウに想定外のエラーが表示されることがあります。MSBuildが、あるべき場所に存在しない重要な命令ファイルを検索している状態です。このファイルがないと、システムはC#コードをどのように処理すればよいか判断できません。
error MSB4019: The imported project "C:\Program Files\Microsoft Visual Studio\...\Microsoft.CSharp.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
VS 2022にアップデートしたばかりであれ、2015年のレガシーなリポジトリをクローンしたばかりであれ、根本的な原因は共通しています。それはビルドチェーン内のリンク切れです。システムはMicrosoft.CSharp.targets(またはそのWeb版相当のファイル)を探していますが、パスが実体のないディレクトリを指しているか、コンポーネント自体がインストールされていません。
ステップ 1: ワークロードを確認する
ワークロードの不足が主な原因です。Visual Studioの標準インストールでは、ディスク容量を節約するために、プロジェクトタイプに必要な特定のSDKがスキップされることがあります。
- Visual Studio Installerを起動します。
- 現在のバージョンを選択し、**[変更]**をクリックします。
- [ワークロード]タブを確認します。**[.NET デスクトップ開発]**にチェックが入っていることを確認してください。これにより、必要なビルドツールが約5〜7GB追加されます。
- Webアプリの場合は、**[ASP.NET と Web 開発]**も有効であることを確認してください。
- **[変更]**をクリックしてダウンロードを開始します。
すべて正しく設定されているのにエラーが解消されない場合は、「修復」オプションを試してください。これにより、MSBuildにインストール場所を教えるレジストリエントリがリセットされます。これは、複数のバージョンを並行してアップグレードした後に発生しやすい問題です。
ステップ 2: 環境変数をクリーンアップする
MSBuildはターゲットを特定するためにシステム変数に依存しています。古いバージョンのVS(2015や2017など)をアンインストールして2022を残した場合、システムが依然として古いC:\Program Files (x86)\MSBuild\14.0フォルダを参照し続けている可能性があります。
MSBuildExtensionsPathとVSToolsPathに注目してください。最新のVisual Studioでは通常これらを内部で処理しますが、以前のシステム全体の設定がそれらを上書きし、競合を引き起こすことがあります。
- Windowsの検索バーに「env」と入力し、**[システム環境変数の編集]**を選択します。
- **[環境変数]**メニューを開きます。
- ユーザー環境変数とシステム環境変数の両方のリストから、
MSBuildやVisual Studioのパスがないかスキャンします。 - VS 2022(バージョン 17.0)を使用しているのに、バージョン 14.0を指すパスがある場合は削除してください。Visual Studioが自動的にパスを解決するようにします。
ステップ 3: .csproj ファイルを監査する
プロジェクトファイル自体に問題がある場合もあります。VS CodeやNotepad++で.csprojを開き、下部にある<Import>タグまでスクロールしてください。
レガシープロジェクトには、次のようにバージョン番号がハードコードされていることがよくあります。
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
これはMSBuildに対し、Visual Studio 2010のツールを明示的に探すよう指示しています。代わりに、動的な$(VisualStudioVersion)変数を使用して修正してください。
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets')" />
Condition属性は非常に有用です。特定のターゲットが欠落していてもビルドを続行できるため、エラーが致命的なものか、単に古い設定の残骸であるかを切り分けるのに役立ちます。
ステップ 4: 開発用シェルに切り替える
標準のWindowsコマンドプロンプトやPowerShell経由でビルドすると、必要な環境コンテキストが不足しているために失敗することがよくあります。これらのシェルはcsc.exeや.targetsファイルがどこにあるかを認識していません。
常にDeveloper Command Prompt for VS 2022を使用してください。このシェルは起動時にスクリプトを実行し、現在のセッションに必要なすべてのパスを設定します。これにより、MSBuildがツールの配置場所を正確に把握できるようになります。
動作確認
Developer Command PromptでMSBuildのバージョンを確認し、環境が正常であることを確認します。
msbuild -version
次に、ソリューションのフルリビルドを試します。
msbuild MySolution.sln /p:Configuration=Release /t:Rebuild
ログに「Build succeeded」と表示されれば、パスの問題は解消されています。
予防策とヒント
CI/CDパイプラインやビルドサーバーの場合、50GBもあるVisual Studio IDEは不要です。代わりにBuild Tools for Visual Studioをインストールしてください。これはUIのオーバーヘッドがなく、コンパイルに必要なすべての.targetsファイルが含まれている軽量なパッケージです。
まれに、ダウンロードの破損によりこれらのファイルが失われることがあります。私はチーム全体で共有しているビルドスクリプトの整合性を確認するために、ハッシュ生成ツールを使用しています。ファイルは存在するのにビルドが失敗する場合、既知の正常なコピーのハッシュと比較することで、密かなファイル破損を迅速に特定できます。
まとめ
- バージョンのハードコードをやめる:
v14.0やv15.0を$(VisualStudioVersion)に置き換えて、プロジェクトのポータビリティを高めましょう。 - 修復ツールを信頼する: 複数のバージョンのVSをインストールしている場合、手動でトラブルシューティングするよりも「修復」ボタンを押す方が早いことがよくあります。
- 適切なシェルを使用する: 標準のPowerShellは一般的なタスク用、Developer PowerShellはビルド用です。これらを混同しないようにしましょう。

