MS_NuGetMSB3086 - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

Nuget使用時に「error MSB3086 Task could not find AL.exe」が発生

概要

構築の度に、ハマるのでメモ。

原因

  • 以下のようなエラーが出た場合、

    • error MSB3086: タスクは SdkToolsPath "・・・" またはレジストリ キー "・・・" を使用して "AL.exe" を見つけられませんでした。

    • error MSB3086: Task could not find "AL.exe" using the SdkToolsPath "・・・" or the registry key "・・・".

  • MSBuild でのビルドに必要な SDK がインストールされていなくてエラーになっている。

補足(AL.exe とは): アセンブリ リンカー(Assembly Linker)で、
主にサテライト アセンブリ(*.resources.dll)の生成に使われる。

Strings.ja.resx → Strings.ja.resources → AL.exe → ja\Foo.resources.dll

つまり、このエラーが出るのは
ローカライズ用のリソース ファイルを持つプロジェクト
である
NuGetパッケージの開発と公開
Localized Package も同じ仕組み)。

AL.exe は **.NET SDK ではなく Windows SDK(.NET Framework SDK)**に
含まれるため、
Visual Studio を入れても、SDK コンポーネントを選ばないと入らない
これが「構築の度にハマる」原因である。

対策

エラー・メッセージを読むと、

MSBuild のタスクで SdkToolsPath を使用して "AL.exe" を発見できなかった旨」

が表示される。

エラーメッセージ中のレジストリキーの情報から SDK のバージョンを特定し、

  • Nuget で入手したライブラリを使用するプロジェクトのビルド時に
    MSB3086 のエラーが発生 – Visual Studio サポート チーム blog
    https://blogs.msdn.microsoft.com/jpvsblog/2016/09/12/nuget-msb3086/
    • Microsoft SDKs\Windows\v10.0A
      Windows 10 用の Windows SDK / .NET Framework 4.6.2 SDK
    • Microsoft SDKs\Windows\v8.1A
      Windows 8.1 用の Windows SDK / .NET Framework 4.5.1 SDK
    • Microsoft SDKs\Windows\v8.0A
      Windows 8 用の Windows SDK / .NET Framework 4.5 SDK
    • Microsoft SDKs\Windows\v7.1A
      Windows 7 用の Windows SDK /.NET Framework 4.0 SDK
    • Microsoft SDKs\Windows\v7.0A
      Windows 7 用の Windows SDK / .NET Framework 3.5 SDK

該当する Windows SDK の [.NET Framework Software Development Kit] をインストールする。

詳細

「対象の NuGet パッケージが必要とする SDK ツールが開発環境に
インストールされていない場合に、このようなエラーが発生する。」とのこと。

MSBuild の問題ではない?

補足(原文の疑問への回答): MSBuild の問題ではない、という
原文の見立ては正しい。整理すると次の通り。

① .resx を持つプロジェクトをビルドする
② MSBuild の GenerateSatelliteAssemblies ターゲットが動く
③ そのタスクが AL.exe を SdkToolsPath / レジストリから探す
④ Windows SDK が未インストール → 見つからない → MSB3086

MSBuild は「探して呼ぶ」だけで、
AL.exe を提供しているのは Windows SDK 側である。

ちなみに NuGet が直接の原因でもない
NuGet パッケージ(ローカライズ リソースを含むもの)を入れたことで、
サテライト アセンブリの生成が必要になった、という間接的な関係である。

最近の SDK 一覧

# Windows .NET Framework
1 v7.0A Windows 7 用の Windows SDK .NET Framework 3.5 SDK
1 https://www.microsoft.com/en-us/download/details.aspx?id=3138 https://www.microsoft.com/en-us/download/details.aspx?id=3138
2 v7.1A Windows 7 用の Windows SDK .NET Framework 4.0 SDK
2 https://www.microsoft.com/en-us/download/details.aspx?id=8279 https://www.microsoft.com/en-us/download/details.aspx?id=8279
3 v8.0A Windows 8 用の Windows SDK .NET Framework 4.5 SDK
3 https://go.microsoft.com/fwlink/p/?LinkId=226658 https://go.microsoft.com/fwlink/p/?LinkId=226658
4 v8.1A Windows 8.1 用の Windows SDK .NET Framework 4.5.1 SDK
4 https://go.microsoft.com/fwlink/p/?LinkId=323507 https://go.microsoft.com/fwlink/p/?LinkId=323507
5 v10.0A Windows 10 用の Windows SDK .NET Framework 4.6.2 SDK
5 https://developer.microsoft.com/ja-jp/windows/downloads/windows-10-sdk https://developer.microsoft.com/ja-jp/windows/downloads/windows-10-sdk

移行メモ(表の展開): 原文は PukiWiki のセル結合(> / ~)で
ダウンロード URL を 2 列にまたがらせていたが、
GitHub Markdown にセル結合が無いため、同じ値を展開して掲載した。

※ OS のバージョンは、開発機の OS バージョンを意味していないので注意。

補足(この注意書きが重要): v8.1A
**「Windows 8.1 で使う SDK」ではなく「Windows 8.1 世代の SDK」**である。
どのバージョンが要るかは、
プロジェクトのターゲット フレームワーク

ターゲット フレームワークのバージョン
と、使っている Visual Studio の世代で決まる。

例えば Windows 11 の開発機でも、
net461 をターゲットにしていれば v8.1A 相当が要求されることがある。

インストール

https://github.com/OpenTouryoProject/OpenTouryoTemplates/issues/48#issuecomment-241349223

にあるように、

  • .NET Framework x.x Software Development Kit

をインストールする。

補足(現在の入手方法/最新化): 原文が挙げる個別の
「Windows SDK」ダウンロード ページは、多くがリンク切れか
統合済みである。現在は Visual Studio Installer から入れるのが確実。

Visual Studio Installer を起動
  → 変更
  → 個別のコンポーネント タブ
  → 「.NET」カテゴリ
      ・.NET Framework 4.x ターゲット パック
      ・.NET Framework 4.x SDK          ← AL.exe はこちら
  → 「SDK、ライブラリ、およびフレームワーク」カテゴリ
      ・Windows 10 SDK / Windows 11 SDK

「ターゲット パック」と「SDK」は別物である点に注意する。

内容 AL.exe
ターゲット パック 参照アセンブリ(コンパイル用) 含まれない
SDK ツール群AL.exesn.exeildasm.exe 等) 含まれる

ビルド サーバーに Visual Studio 本体を入れたくない場合は、
Build Tools for Visual Studio で同じコンポーネントを選べる。

vs_buildtools.exe --quiet --wait `
  --add Microsoft.VisualStudio.Workload.MSBuildTools `
  --add Microsoft.Net.Component.4.8.SDK `
  --add Microsoft.Net.Component.4.8.TargetingPack

なお、.NET Core / .NET(SDK スタイル)では発生しない
サテライト アセンブリの生成に AL.exe を使わず、
Roslyn(csc)が直接生成するようになったためである。
.NET Coreへの移行 を済ませれば、
このエラーとは無縁になる。

参考

Microsoft Learn


Tags: 移行, .NET開発, デプロイ, デバッグ, NuGet

⚠️ **GitHub.com Fallback** ⚠️