-
Notifications
You must be signed in to change notification settings - Fork 0
MS_MSBuildCS1519
- 戻る(MSBuild)
auto-implemented propertyのあるプロジェクトを
MSBuildでビルドしようとしたら error CS1519 が出た。
補足(症状の見分け方): CS1519 は本来
「構文エラー(予期しない記号)」を意味する汎用のエラーで、
通常はタイプミス(括弧の閉じ忘れ、セミコロン欠落)で出る。しかし、Visual Studio では通るのに MSBuild では出る場合、
原因は構文ではなく
**「コンパイラが古く、その C# 構文を知らない」**ことにある。【新しい構文をコンパイラが知らない場合の見え方】 public string Name { get; set; } = "既定値"; ^ → C# 6 を知らないコンパイラには、ここが「予期しない記号」に見える → CS1519同じソースで、環境によって結果が変わる——これが判別の鍵である。
-
auto-implemented propertyは、C# version 6 から利用可能。
-
MSBuildを使用して、C# version 6 としてコンパイルするには、
Microsoft.Net.Compilers が必要になるケースがある。
Install-Package Microsoft.Net.Compilers
※ ただ、MSBuild のバージョンを、15 以上にする必要があるケースがある。
移行メモ(用語の補足): 原文の「auto-implemented property」は、
C# 3.0 からある自動実装プロパティ({ get; set; })そのものではなく、
C# 6.0 で追加された「自動実装プロパティの初期化子」
({ get; set; } = 値;)や
getter のみの自動実装プロパティを指していると読める
(これらが C# 6 以降の機能であるため)。
補足(なぜコンパイラが古いのか): MSBuild は
C# コンパイラ(csc.exe)を呼び出すだけで、
どのcsc.exeを使うかは環境で決まる。【古い経路】 C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe → C# 5 相当。Roslyn 以前のコンパイラ 【新しい経路】 <VS インストール先>\MSBuild\Current\Bin\Roslyn\csc.exe → Roslyn。C# 最新版に対応MSBuild 14.0(VS 2015)以前は前者を呼ぶことがあり、
C# 6 の構文で CS1519 が出る。
原文の「MSBuild のバージョンを 15 以上にする必要がある」は
まさにこの点を指しており、正しい。
Microsoft.Net.Compilersパッケージは、
Roslyn コンパイラをプロジェクトに同梱して、
MSBuild にそれを使わせるためのものである。packages\Microsoft.Net.Compilers.x.y.z\tools\csc.exe → .props / .targets が MSBuild の CscToolPath を書き換える → 環境の MSBuild が古くても、新しい C# でコンパイルできる
補足(現在の対処/最新化):
Microsoft.Net.Compilersは
非推奨であり、現在は使うべきではない。
パッケージ 現況 Microsoft.Net.Compilers非推奨(.NET Framework 版 csc の同梱) Microsoft.Net.Compilers.Toolset後継。ビルド環境を固定したい場合のみ 通常は、ビルド環境側を新しくするのが正しい対処である。
対処 内容 ① ビルド サーバーの VS / Build Tools を更新 最も確実。MSBuild 15 以上(VS 2017+) ② dotnet buildを使う.NET SDK 同梱の Roslyn が使われる ③ LangVersionを明示する使う C# 版を固定して事故を防ぐ ④ Microsoft.Net.Compilers.ToolsetCI で版を固定したい場合のみ <PropertyGroup> <!-- 使用する C# のバージョンを明示する --> <LangVersion>latest</LangVersion> </PropertyGroup>
LangVersionを明示しておくと、
「環境によって使える構文が違う」という事態を早期に検出できる
(古いコンパイラでは、そもそもLangVersionの指定でエラーになる)。なお、SDK スタイル プロジェクトでは既定で新しい Roslyn が使われるため、
本エラーは発生しない。
packages.config+ 旧形式.csprojを
古いビルド サーバーでビルドしている場合に限った問題である。
補足(切り分けの手順): CS1519 が出たら、次の順で確認する。
① Visual Studio ではビルドできるか? できない → 本当に構文エラー(ソースを直す) できる → 環境差。②へ ② どの csc.exe が使われているか? msbuild Foo.sln -v:d | findstr /i "csc.exe" ③ MSBuild のバージョンは? msbuild -version → 15.0 未満なら、ビルド環境の更新を検討# 使われている MSBuild を特定する(vswhere) & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" ` -latest -requires Microsoft.Component.MSBuild ` -find MSBuild\**\Bin\MSBuild.exe詳細は MSBuild の「MSBuild の場所」に関する記述を参照。
- How to upgrade msbuild to C# 6? - Stack Overflow
https://stackoverflow.com/questions/32007871/how-to-upgrade-msbuild-to-c-sharp-6
- コンパイラ エラー CS1519
https://learn.microsoft.com/ja-jp/dotnet/csharp/misc/cs1519 - C# 言語のバージョン管理
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/configure-language-version - 自動実装プロパティ
https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties
Tags: 移行, テスト, デバッグ, デプロイ, .NET開発
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。