很多人都遇到了这个问题,所以我想在这里发布一下。
感谢这位Expertdebugger,他提供了一个非常简单的解决方法。
只需将语言版本从C# 6降级至C# 5即可:
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701">
<providerOption name="CompilerVersion" value="v4.0"/>
</compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+">
<providerOption name="CompilerVersion" value="v4.0"/>
</compiler>
</compilers>
</system.codedom>
将底部的langversion:6
更改为5-langversion:5
对我有用,感谢他。
如果您想要使用C# 6.0:
.config
文件进行以下修改。查找system.codedom
并对其进行修改,以使其显示如下:
<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>
在我的情况下错误是:
Error CS1617 对于 /langversion,选项“latest”无效;必须是 ISO-1、ISO-2、Default 或范围为 1 到 6 的整数。
我用记事本打开了我的 .csproj 文件,并看到了这一行:
<PropertyGroup>
<LangVersion>latest</LangVersion>
</PropertyGroup>
我将最新的值改为 1 到 6 范围内的整数
<LangVersion>6</LangVersion>
错误已消失!
在我的情况下(在另一个系统中创建的项目):
我可以运行这个项目。
我发现在我的情况下导致错误的直接原因是:
这很有道理,因为错误提示语句表明语言选项是无效的。
但是,在这之前它一直正常工作,所以它必须已经被选中了。什么改变了呢?原来我的团队成员升级到vs 2017,而我还在使用2015。他更改了项目后,语言版本发生了变化,然后我通过源代码控制接收到了这个变化。但是我的vs版本中未提供所选的版本,所以它为空 - 因此会出现错误。在语言下拉列表中选择一个值(我选择默认值)后,出现了新的错误。任何使用较新版本c#的代码行都会导致构建失败的新错误。我用我的c#版本语法修改了代码以执行相同的功能,问题解决了。
因此,尽管错误的直接原因确实是语言版本的无效选择,但根本原因是不同的vs/c#版本之间发生了冲突。
在我的情况下,我使用了错误的MSBuild.exe,那个可以在以下位置找到:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
为了解决这个错误,我更新了我的PATH环境变量以开始使用Visual Studio 2017 MSBuild.exe:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSbuild.exe
请查看此链接以获取更多详细信息:Error CS1056: Unexpected character '$' running the msbuild on a tfs continuous integration process
不要将语言版本从6更改为5,而是将编译器标记上的“type”属性更改为
Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
to
Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
将Microsoft.Net.Compilers Nuget包升级到最新版本(至少是2.x)
如果所有的选项都无法解决问题,并且您已经使用了类似于Microsoft.Net.Compilers和CodeDom之类的NuGet包,但仍然无法工作,则可能是您的项目文件存在问题。打开项目文件。项目文件正在使用其中一个不支持您选择的语言的编译器选项。使用Notepad++打开项目文件并删除以下行。
原始项目文件
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Microsoft.Net.Compilers.Toolset.3.7.0\build\Microsoft.Net.Compilers.Toolset.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.Toolset.3.7.0\build\Microsoft.Net.Compilers.Toolset.props')" />
<Import Project="..\packages\Microsoft.Net.Compilers.3.7.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.3.7.0\build\Microsoft.Net.Compilers.props')" />
<Import Project="..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props')" />
<!--Don't delete below one-->
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
移除以下行
<Import Project="..\packages\Microsoft.Net.Compilers.Toolset.3.7.0\build\Microsoft.Net.Compilers.Toolset.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.Toolset.3.7.0\build\Microsoft.Net.Compilers.Toolset.props')" />
<Import Project="..\packages\Microsoft.Net.Compilers.3.7.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.3.7.0\build\Microsoft.Net.Compilers.props')" />
<Import Project="..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props')" />