3
2

More than 3 years have passed since last update.

レガシーなVisualStudioでNuGetして四苦八苦した話

Last updated at Posted at 2020-12-01

お仕事のなかでレガシーなVisualStudio(2013や2015)を利用するケースが多く、NuGetを利用した依存性解決を行おうとしたときに四苦八苦した事例を紹介します。

発生条件

古いバージョンのVisualStudio、とくにVisualStudio 2013を利用している。

発生事象1

NuGet.exeによるパッケージの復元を行うとき(VSでビルドを行ったときなどが該当)、System.MissingMethodException例外がスローされビルドが中断してしまう。

VS2013の出力内容:

エラー 1 ハンドルされていない例外: System.MissingMethodException: メソッドが見つかりません: '!!0[] System.Array.Empty()' ConsoleApplication1
エラー 2 場所 NuGet.Common.CommandLineResponseFile.ParseArgsResponseFiles(String[] args, Int32 parseArgsResponseFileRecursionDepth) ConsoleApplication1
エラー 3 場所 NuGet.CommandLine.Program.Main(String[] args) ConsoleApplication1
エラー 4 コマンド ""c:\users\mizukyf\documents\visual studio 2013\Projects\ConsoleApplication1\.nuget\NuGet.exe" install "c:\users\mizukyf\documents\visual studio 2013\Projects\ConsoleApplication1\ConsoleApplication1\packages.config" -source "" -NonInteractive -RequireConsent -solutionDir "c:\users\mizukyf\documents\visual studio 2013\Projects\ConsoleApplication1\ "" はコード -532462766 で終了しました。 ConsoleApplication1

事象発生時のVS2013画面の例:
3279343280image.png

発生事象1 - 原因

NuGet.exeが想定する.NET Frameworkのバージョンと、開発マシンにインストールされている.NET Frameworkのバージョンの齟齬。

とくにVisual Studio 2013(以降、VS2013)を利用している場合この事象が起きやすいです。VS 2013までNuGet.exeとVSとの統合が中途半端で、新規ソリューションで「NuGetによるパッケージの復元」を有効化するたび、当該ソリューション内にその時点で最新のNuGet.exeがWeb上からダウンロードされ利用されるからです。

発生事象1 - 対策

Microsoft社のWebサイトから最新の.NET Framework(v4.6以上)をダウンロードして開発PCにインストールする。

発生事象2

NuGet.exeによるパッケージの復元を行うとき(VSでビルドを行ったときなどが該当)、エラーが発生「Unable to find version...」「コード 1 で終了しました」という出力とともにビルドが中断してしまう。

VS2013の出力内容:

エラー   6   Unable to find version '3.2.0.0' of package 'NLog'. (project name)
エラー   7   Unable to find version '12.1.022' of package 'Oracle.ManagedDataAccess'.    (project name)
エラー   8   Unable to find version '12.1.022' of package 'Oracle.ManagedDataAccess.EntityFramework'.    (project name)
エラー   9   コマンド ""C:\path\to\solution\.nuget\NuGet.exe" install "C:\path\to\solution\project\packages.config" -source ""  -NonInteractive -RequireConsent -solutionDir "C:\path\to\solution\ "" はコード 1 で終了しました。    (project name)

発生事象2 - 原因

NuGet.exeのバージョンが古く、パッケージリポジトリNuGet Galleryにアクセスして依存性解決する際のプロトコルがNuGet Galleryサポート対象外となってしまっている。

これもとくにVisual Studio 2013(以降、VS2013)を利用している場合発生しやすいです。理由は事象1と同様です。

発生事象2 - 対策

NuGetの公式サイトから新しいバージョンのNuGetを取得してインストールする。
とくにVS2013の場合は、ソリューションフォルダ直下の.nugetフォルダに格納されたEXEを上書きする。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2