错误 CS1056:在 tfs 持续集成进程上运行 msbuild 时出现意外字符“$”

Error CS1056: Unexpected character '$' running the msbuild on a tfs continuous integration process

提问人:Heinrich 提问时间:3/22/2017 最后编辑:VMAtmHeinrich 更新时间:7/19/2021 访问量:86448

问:

我有一个框架针对的项目,作为 tfs 上持续集成过程的一部分,我们创建了一个构建解决方案任务,以确保代码正确编译。
现在,TFS 服务器具有最新版本的 .在寄存器上,这是框架的 Release 密钥的值
.NET Framework 4.6.1.Net Famework 4.6.2

在所有其他操作系统版本上:394806 => .NET Framework 4.6.2

但是当构建运行时,它会出现以下错误:

Error CS1056: Unexpected character '$'

我不想用 来解决这个问题,请提供另一种解决方法来解决这个问题。string.Format

是否需要在 TFS 服务器上安装其他内容?

C TFS C#-6.0 . net-framework版本

评论

0赞 BJ Myers 3/22/2017
服务器上运行的是哪个版本的 MSBuild?
0赞 VMAtm 3/22/2017
您需要更新工具,而不是框架MSBuild.NET
0赞 Heinrich 3/24/2017
@VMAtm我该怎么做呢?我刚刚下载了 microsoft.com/en-us/download/details.aspx?id=48159,这是失败的
0赞 VMAtm 3/24/2017
@Heinrich添加了一个答案
0赞 Baahubali 6/9/2017
这个答案为我解决了这个问题:stackoverflow.com/questions/31180393/......

答:

2赞 Paulo Morgado 3/22/2017 #1

我只是猜测你有带有字符串插值的代码,但没有合适的构建工具

评论

0赞 Heinrich 3/22/2017
实际上,我在服务器上安装了该工具的更高版本
0赞 Paulo Morgado 3/22/2017
查看发生错误的代码会有所帮助。
14赞 VMAtm 3/24/2017 #2

MS Build Tools 2015 安装到中后,需要使用新值 () 覆盖生成服务器的 MSBuild 版本%ProgramFiles%\MSBuild\14.0\bin14.0

您应该阅读 MSDN 文章(或此答案),但 TL;DR 您的选择是:

  • 从命令行生成项目或解决方案时,使用开关(或简称)替代版本:/ToolsVersion/tv

    msbuild.exe someproj.proj /tv:14.0 /p:Configuration=Debug
    
  • 通过在任务上设置参数来覆盖版本:ToolsVersionMSBuild

    <MSBuild Projects="myProject.proj"  
        ToolsVersion="14.0"  
        Targets="go" />
    
  • 通过在解决方案中的项目上设置 $(Project.ToolsVersion) 属性来重写版本。这使您可以在解决方案中生成一个项目,其 a 与其他项目不同:ToolsetVersion

    <Project ToolsVersion="14.0" ... </Project>  
    

优先级顺序(从最高到最低)用于确定:ToolsVersion

  1. 用于生成项目的任务的属性(如果有)。ToolsVersionMSBuild
  2. 命令中使用的 (或 ) 开关(如果有)。/toolsversion/tvmsbuild.exe
  3. 如果设置了环境变量,则使用当前的 .MSBUILDTREATALLTOOLSVERSIONSASCURRENTToolsVersion
  4. 如果设置了环境变量,并且项目文件中定义的 大于当前 ,则使用当前 .MSBUILDTREATHIGHERTOOLSVERSIONASCURRENTToolsVersionToolsVersionToolsVersion
  5. 如果设置了环境变量,或者未设置环境变量,则使用以下步骤:MSBUILDLEGACYDEFAULTTOOLSVERSIONToolsVersion
    • 项目文件的 Project 元素的属性。如果此属性不存在,则假定它是当前版本。ToolsVersion
    • 文件中的默认工具版本。MSBuild.exe.config
    • 注册表中的默认工具版本。有关详细信息,请参阅标准和自定义工具集配置
  6. 如果未设置环境变量,则使用以下步骤:MSBUILDLEGACYDEFAULTTOOLSVERSION
    • 如果环境变量设置为已存在,请使用它。MSBUILDDEFAULTTOOLSVERSIONToolsVersion
    • 如果设置在 中,请使用它。DefaultOverrideToolsVersionMSBuild.exe.config
    • 如果在注册表中设置,请使用它。DefaultOverrideToolsVersion
    • 否则,请使用当前的 .ToolsVersion

评论

2赞 Heinrich 3/24/2017
我尝试了所有这些更改,即使我将寄存器上的值更改为将默认版本更改为 14.0,我也更改了 MSBuild.exe.config,但一切都没有成功。我的项目具有正确的 ToolsVersion
2赞 Shrike 5/31/2017
@Heinrich还需要确保从“C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\”(而不是从 C:\Windows\Microsoft.NET\Framework\v4.0.30319)运行 msbuild.exe
1赞 knocte 10/9/2017
对我来说,这条路是"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
31赞 Zinov 3/25/2017 #3

安装 Nuget 包可以解决此问题 Microsoft.Net.编译器。 下面是我突出显示的答案的链接: 项目使用 Visual Studio 生成良好,但从命令行失败

该功能是 C#6 的语法糖,请尝试安装最新的 框架版本 4.6.2 https://www.microsoft.com/en-us/download/details.aspx?id=53345

然后转到“项目”属性并在“应用程序”上进行更改 选项指向 Latest。你不需要 更改代码以将字符串插值替换为 字符串。格式化方法来修复它。如果您仍然收到此错误, 这是因为,运行构建的编译器不是最新的 版本的 C#,请尝试从 Nuget Microsoft和 再次编译,这应该可以解决问题。如果你想避免 安装这个包,尝试打开你的 .csproj 并查看 ToolsVersion.that 应该指向版本 12,然后更改它 设置为 14,但请确保您已安装最新版本的 MSBuild from https://www.microsoft.com/en-us/download/details.aspx?id=48159 或 go 到 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生成工具2015

3- 大锤和最后一个选项,但对我来说最好的,因为您不需要处理对 nuget 的依赖,是在运行该过程的 tfs 服务器上安装 Visual Studio 版本。

希望这会有所帮助

评论

0赞 Heinrich 3/25/2017
安装此Nuget包的依赖项解决了我的问题。如果我有 100 个项目,有什么方法可以避免安装依赖项?
0赞 Zinov 3/28/2017
看看我的答案 这里 stackoverflow.com/a/43072823/819153
8赞 CharlesS 10/31/2017 #4

您可能使用错误的 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
2赞 Tyler Forsythe 5/15/2018 #5

我的解决方案是 2 部分:

1)使用Visual Studio 2015,选择您的Web项目,单击“项目”菜单,选择“启用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=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
7赞 Mike Flynn 1/2/2019 #6

Microsoft.Net.Compilers 不起作用,但从 Nuget 安装 DotNetCompilerPlatform 可以。

3赞 motodiver 4/9/2019 #7

必须使用 msbuild 版本 15。

评论

0赞 Keshab 9/15/2021
这个对我有帮助。我从 TeamCity 收到上述错误。将 MSBuild 版本更改为 15 就可以了。
3赞 SiretT 7/17/2021 #8

我遇到这个问题是因为我使用了错误的msbuild路径。我使用的是对应于旧版本的 Visual Studio 和 Frameworks,现在我使用 Visual Studio 2019,因此正确的构建路径是或取决于您要构建的体系结构。C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exeC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exeC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\amd64\MSBuild.exe