コードが正しくコンパイルされるようにするために、ソリューションのビルドタスクを作成したtfsの継続的統合プロセスの一部として、フレームワークが.NET Framework 4.6.1
をターゲットにしているプロジェクトがあります。
TFSサーバーには.Net Famework 4.6.2
の最新バージョンがあります。レジスタでは、これはフレームワークのリリースキーの値です。
他のすべてのOSバージョン:394806 => .NET Framework 4.6.2
ただし、ビルドを実行すると、次のエラーが発生します。
Error CS1056: Unexpected character '$'
この問題を解決するために、文字列補間をstring.Format
に置き換えたくありません。別の回避策を提供して解決してください。
TFSサーバーに何か他のものをインストールする必要がありますか?
この問題は、NugetパッケージMicrosoft.Net.Compilersをインストールすることで修正できます。ハイライトされた答えのリンクを次に示します。 プロジェクトはVisual Studioで正常にビルドされますが、コマンドラインからは失敗します
その機能はC#6の構文糖衣です。フレームワーク4.6.2の最新バージョンをインストールしてみてください https://www.Microsoft.com/en-us/download/details.aspx?id=53345
次に、プロジェクトのプロパティに移動し、ターゲットフレームワークの[アプリケーション]オプションを変更して、最新のものを指すようにします。文字列の補間をstring.Formatメソッドに置き換えて修正するためにコードを変更する必要はありません。それでもこのエラーが発生する場合は、ビルドを実行しているコンパイラーがC#の最新バージョンではないため、NugetからMicrosoft.Net.Compilersを追加して再コンパイルし、問題を解決する必要があります。このパッケージのインストールを避けたい場合は、.csprojを開いて、バージョン12を指しているはずのToolsVersion。を見てみて、14に変更してください。ただし、最新バージョンがインストールされていることを確認してください。 https://www.Microsoft.com/en-us/download/details.aspx?id=48159 からMSBuild、またはC:\ Program Files(x86)\ MSBuild\14.0\Binに移動し、そこにcsc.exeコンパイラを含むこのフォルダーが必要です。それでも問題が解決しない場合は、この手順に従ってください https://msdn.Microsoft.com/en-us/library/bb383985.aspx 。
私の経験では、この問題を3つの異なる方法で解決しました。
1- Nugetからパッケージを取得するだけ
2- tfsサーバーにMicrosoft Build Tools 2015をインストールする
3-ハンマーと最後のオプションですが、私にとっては、nugetへの依存を処理する必要がないので、プロセスを実行するtfsサーバーにVisual Studioバージョンをインストールするのが最善です。
お役に立てれば
MS Build tools 2015 を%ProgramFiles%\MSBuild\14.0\bin
にインストールした後、 ビルドサーバーのMSBuildバージョンを上書きする必要があります 新しい値(14.0
)。
MSDNの記事(または この回答 )を読む必要がありますが、TL; DRオプションは次のとおりです。
コマンドラインからプロジェクトまたはソリューションをビルドするときに、/ToolsVersion
スイッチ(または略して/tv
)を使用してバージョンをオーバーライドします。
msbuild.exe someproj.proj /tv:14.0 /p:Configuration=Debug
ToolsVersion
タスクでMSBuild
パラメーターを設定して、バージョンをオーバーライドします。
<MSBuild Projects="myProject.proj"
ToolsVersion="14.0"
Targets="go" />
ソリューション内のプロジェクトで $(Project.ToolsVersion)
プロパティを設定して、バージョンをオーバーライドします。これにより、他のプロジェクトとは異なるToolsetVersion
を持つソリューションでプロジェクトをビルドできます。
<Project ToolsVersion="14.0" ... </Project>
ToolsVersion
の決定に使用される優先順位は、最高から最低の順です。
- プロジェクトのビルドに使用された
ToolsVersion
タスクのMSBuild
属性(ある場合)。/toolsversion
コマンドで使用される/tv
(またはmsbuild.exe
)スイッチ(ある場合)。- 環境変数
MSBUILDTREATALLTOOLSVERSIONSASCURRENT
が設定されている場合、現在のToolsVersion
を使用します。- 環境変数
MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT
が設定されていて、プロジェクトファイルで定義されているToolsVersion
が現在のToolsVersion
よりも大きい場合、現在のToolsVersion
を使用します。- 環境変数
MSBUILDLEGACYDEFAULTTOOLSVERSION
が設定されている場合、またはToolsVersion
が設定されていない場合、次の手順が使用されます。
- プロジェクトファイルの
ToolsVersion
要素のProject
属性。この属性が存在しない場合、現在のバージョンと見なされます。MSBuild.exe.config
ファイル内のデフォルトのツールバージョン。- レジストリ内のデフォルトのツールバージョン。詳細については、「 標準およびカスタムツールセット構成 」を参照してください。
- 環境変数
MSBUILDLEGACYDEFAULTTOOLSVERSION
が設定されていない場合、次の手順が使用されます。
- 環境変数
MSBUILDDEFAULTTOOLSVERSION
が存在するToolsVersion
に設定されている場合は、それを使用します。DefaultOverrideToolsVersion
がMSBuild.exe.config
に設定されている場合は、それを使用します。DefaultOverrideToolsVersion
がレジストリに設定されている場合は、それを使用します。- それ以外の場合は、現在の
ToolsVersion
を使用します。
間違ったMSbuild.exeでビルドしている可能性があります。 Visual Studio(動作する場所)でコンパイルを行い、出力でログを確認します。次のようなものがあるはずです。
1>Target "GetReferenceAssemblyPaths" in file "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets"
私の場合、そのBinディレクトリでMSBuild.exeを使用していることを確認してください。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSbuild.exe
Microsoft.Net.Compilersは機能しませんでしたが、Nugetから DotNetCompilerPlatform をインストールしました。
Msbuildバージョン15を使用する必要があります。
文字列補間を使用したコードがあり、 適切なビルドツール がないと推測しています。
私の解決策は2つの部分でした:
1)Visual Studio 2015を使用して、Webプロジェクトを選択し、Projectメニューをクリックして、「Enable C#6」を選択します
2)構成の終了タグの直前に、実動web.configの最後に以下を追加する必要がありました。バージョン番号は将来変更される可能性がありますが、重要なのは、手順1で有効にした後、開発web.configで同様のテキストを探し、本番環境に確実に転送することです。
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
</compilers>
</system.codedom>