CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Visual Studio 2017で「エラー MSB4018」が出たときの対処方法

前回に引き続きPWA(Progressive Web App)について調べています。

www.crossroad-tech.com

前回は、オフライン化には成功したものの、キャッシュの扱いが不十分である程度時間が経つと再度アクセスが必要でした。これを解決する方法を探しているのですが、色々と調べていると、Visual StudioでもPWAアプリを作れることがわかりました。

docs.microsoft.com

しかし、試してみたのですがまだサンプル通りに動いていません。また、途中で「MSB4018」というエラーが出ていました。

問題解決のために「MSB4018」について調べたところ、思ったよりもエラーの示す範囲が広く、日本語の情報がほとんどありませんでした。そこで、今回は「MSB4018」の内容と対処方法について解説します。

使用した環境です。

・Parallel Desktop (15.0,0) on MacOSX 10.15
・Visual Studio 2017 Enterprise 15.9.16

1. エラーが発生したときの状況

こちらのページを参考にして、Visual StudioでBasic Node.js Express 4 Application(基本のNode.js Express4アプリケーション)を作成し、チュートリアルに沿って進めました。

docs.microsoft.com

途中に以下の記述があり、ビルドを実行しました。

Let's test out your PWA! Build (Ctrl+Shift+B) and Run (F5) your web app to launch Microsoft Edge and open your localhost page.

すると、このようなログが出てビルドに失敗しました。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Node.js Tools\Microsoft.NodejsTools.targets(115,5): error MSB4018: The "AssignTargetPath" task failed unexpectedly.
System.ArgumentException: Illegal characters in path.
   at System.Security.Permissions.FileIOPermission.EmulateFileIOPermissionChecks(String fullPath)
   at System.Security.Permissions.FileIOPermission.QuickDemand(FileIOPermissionAccess access, String fullPath, Boolean checkForDuplicates, Boolean needFullPath)
   at Microsoft.Build.Tasks.AssignTargetPath.Execute()
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()
Done building project "PWATest.njsproj" -- FAILED.

2. MSBとは何か?

まず、MSBとはMSBuildの略のようです。MSBuildについてはこちらの説明をご参考ください。

Microsoft Build Engine は、アプリケーションをビルドするためのプラットフォームです。
MSBuild とも呼ばれるこのエンジンには、ビルド プラットフォームでソフトウェアを処理およびビルドする方法を制御する、プロジェクト ファイル用の XML スキーマが用意されています。
Visual Studio は MSBuild を使用しますが、MSBuild は Visual Studio に依存しません。

引用元 :MSBuild - Visual Studio | Microsoft Docs

少し前の情報ですが、2015年頃の以下の記事ではあえてVisual Studioを使わずにビルドができることを示しており、わかりやすいです。

www.atmarkit.co.jp

3. MSB4018とは何か?

MSBuildに関するエラーコードで、ビルド中のタスクに何らかの異常あったときに出力されるエラーコードのようです。はじめに、"task name " task failed unexpectedly (日本語版だと"タスク名称" タスクが予期せずに失敗しました。 )が表示され、そのあとで具体的なエラー内容が示されます。

しかし、エラー内容は状況によって様々です。

4. 今回表示された System.ArgumentException: Illegal characters in pathの原因と対応

Illegal characters in pathで調べると、ファイルパスの書き方が間違っていたり、spaceなどが入っていることが原因という情報がありました。

c# - System.ArgumentException: Illegal characters in path. error - Stack Overflow

MSBuild error: MSB4014 "Illegal characters in path" · Issue #8875 · dotnet/sdk · GitHub

私の場合はいずれでもなく、Parallel Desktop上でWindowsを使っていて、Visual Studioのプロジェクト配置場所が¥¥Macで始まっていたことが原因でした。

補足:Parallel Desktopとは、Mac上でWindowsを動かすためのソフトウェアです。

filepath rule of windows 10 on Parallel Desktop

普段意識していないので今回初めて気付いたのですが、Parallel Desktop上のWindows10でエクスプローラを開くと、「ドキュメント」、「デスクトップ」などのファイルパスは "\\Mac\Home\Documents\""\\Mac\Home\Desktop" となります。

Windows固有の"C:¥"でのファイルパスでフォルダやファイルを作るには、「ローカルディスク(C:)」からアクセスする必要があります。

今回、「ドキュメント」の階層にVisual Studioのプロジェクトを作っていました。これを「ローカルディスク(C:)」の階層で作り直したところ、エラーが発生しなくなりました。

「ドキュメント」の階層で作成した場合:Illegal characters in path発生
\\Mac\Home\Documents\VS17\PWATest\PWATest.sln

「ローカルディスク(C:)」の階層で作成した場合:エラーなし
C:\Users\usernamei\Documents\VS17\PWATest\PWATest.sln

5. 補足:その他のMSB4018の例と対処方法

MSB4018の示す範囲が広い割りには、日本語の情報はほとんどありませんでした。そこで、英語の情報をいくつか集めてみました。

なお、英語のエラーを表示するには、Visual Studioを英語表記に変更する必要があります。下記の手順で変更できます。

Visual Studio 2017 の表示を英語にしたい - Qiita

5.1 Mono.Linker.MarkException: Error processing method:

Xamarinのビルド設定で失敗しており、<Reference>タグに書かれたVersion表記を修正することで解決したようです。

Error MSB4018: The "LinkAssemblies" task failed unexpectedly. #6902

5.2 System.Exception: Could not find valid a SingleProjectInfo for project

.NETのclass libraryの使い方、呼び方が問題かという議論がありましたが、Visual Studioの最新版(2017/4/27以降)インストールで解決したようです。

Build fails (MSB4018) when referencing a .NET standard project that references another .NET standard project. - Developer Community

5.3 System.NullReferenceException: Object reference not set to an instance of an object

Linkというタスク設定に原因があり、解決方法がいくつか提案されています。

(1) projファイルから<Link><GenerateDebugInformation></GenerateDebugInformation></Link>を削除する

(2) Debug Infoの設定からOptimize for debugging (/DEBUG) か Noを設定する

(3) .\Project\bin、.\Project\objファイルを削除する

visual studio 2012 - MSBuild error MSB4018 in VS2015: The "Link" task failed unexpectedly - Stack Overflow

5.4 System.IO.FileNotFoundException: Could not load file or assembly 'System.IO.FileSystem

.NET Coreのアプリケーション作成時のエラーですが、こちらは内部バグだったようです。

[Test Failure] Build error MSB4018 occur after updating package ‘Microsoft.NETCore.App’ in .NET Core Console templates · Issue #4233 · NuGet/Home · GitHub

5.5 System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.

C++アプリケーション作成時のエラーです。出力設定の箇所で $(SolutionDir)bin\; という記述にセミコロンをつけてしまっていたのが原因のようです。

Topic: VS2017 Build Error error MSB4018: – The "VCMessage" task failed unexpectedly / sciter

5.6 System.ComponentModel.Win32Exception (0x80004005): Access is denied

PostSharp導入環境でのエラーです。原因はウイルス対策ソフトがブロックする場合か、フォルダのアクセス設定で発生するようです。

PostSharp Service Desk

ちなみに、PostSharpとは定型化できる実装を自動化してくれるツールです。

PostSharpがリリースされました

5.7 System.ComponentModel.Win32Exception (0x80004005): Invalid argument

WSL(Windows Subsystem for Linux)の環境で、.NET Coreのビルドが失敗した時のエラーです。WSL上のUbuntuで、/mntの中にプロジェクトを作成したのが原因のようです。

Unable to run Hello World on .NET Core 3 on WSL2 (Ubuntu 18.04) · Issue #3444 · dotnet/core · GitHub

ちなみに、WSLについてはこちらを参照ください。

Install Windows Subsystem for Linux (WSL) on Windows 10 | Microsoft Docs

【WSL入門】第1回 Windows 10標準Linux環境WSLを始めよう:ITの教室 - @IT

こちらはAzure App Service向けのビルド失敗時のエラーです。唯一の日本語情報です。"Path environment variable"の指定を追加したところ解決したそうです。

saamonumai.com

6. おわりに

Parallel Desktop由来のファイルパスでエラーが起きると予想していなかったことと、MSB4018の示すエラーが多様だったので、思ったより時間がかかりました。
次回は、当初進めていたPWAサンプルコードが動かなかった原因について書く予定です。