【问题标题】:Error CS1056: Unexpected character '$' running the msbuild on a tfs continuous integration process错误 CS1056:在 tfs 持续集成过程中运行 msbuild 时出现意外字符“$”
【发布时间】:2017-08-13 10:35:51
【问题描述】:

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

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

但是当构建运行时会出现这个错误:

Error CS1056: Unexpected character '$'

我不想用 string.Format 替换字符串插值来解决这个问题,请提供另一种解决方法。

我需要在 TFS 服务器上安装其他东西吗?

【问题讨论】:

标签: c# tfs c#-5.0 c#-6.0 .net-framework-version


【解决方案1】:

问题可以通过安装 Nuget 包来解决 Microsoft.Net.Compilers。以下是我突出显示的答案的链接:Project builds fine with Visual Studio but fails from the command line

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

然后转到您的项目属性并更改应用程序 目标框架上的选项以指向最新的。你不需要 更改代码以替换字符串插值 string.Format 方法来修复它。如果您仍然收到此错误, 是因为,运行您的构建的编译器不是最新的 C# 版本,尝试从 Nuget 添加 Microsoft.Net.Compilers 和 再次编译,应该可以解决问题。如果你想避免 安装此软件包,尝试打开您的 .csproj 并查看 ToolsVersion.that 应该指向版本 12,然后更改它 到 14,但请确保您已安装最新版本的 MSBuild 来自 https://www.microsoft.com/en-us/download/details.aspx?id=48159 或者去 到 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 版本。

希望对你有帮助

【讨论】:

  • 安装此 Nuget 包的依赖项解决了我的问题。如果我有 100 个项目,有什么方法可以避免安装依赖项?
【解决方案2】:

MS Build tools 2015 安装到%ProgramFiles%\MSBuild\14.0\bin 后,您需要将override the MSBuild version for build server 设置为新值(14.0)。

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

  • 从命令行构建项目或解决方案时,使用/ToolsVersion 开关(或简称/tv)覆盖版本:

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

    <MSBuild Projects="myProject.proj"  
        ToolsVersion="14.0"  
        Targets="go" />
    
  • 通过在解决方案中的项目上设置$(Project.ToolsVersion) 属性来覆盖版本。这使您可以在解决方案中使用与其他项目不同的 ToolsetVersion 构建项目:

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

用于确定ToolsVersion的优先级从高到低的顺序是:

  1. 用于构建项目的MSBuild 任务的ToolsVersion 属性(如果有)。
  2. msbuild.exe 命令中使用的/toolsversion(或/tv)开关(如果有)。
  3. 如果设置了环境变量MSBUILDTREATALLTOOLSVERSIONSASCURRENT,则使用当前的ToolsVersion
  4. 如果设置了环境变量MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT,并且项目文件中定义的ToolsVersion大于当前的ToolsVersion,则使用当前的ToolsVersion
  5. 如果设置了环境变量MSBUILDLEGACYDEFAULTTOOLSVERSION,或者没有设置ToolsVersion,则使用以下步骤:
    • 项目文件的Project 元素的ToolsVersion 属性。如果此属性不存在,则假定为当前版本。
    • MSBuild.exe.config 文件中的默认工具版本。
    • 注册表中的默认工具版本。如需更多信息,请参阅Standard and Custom Toolset Configurations
  6. 如果未设置环境变量MSBUILDLEGACYDEFAULTTOOLSVERSION,则使用以下步骤:
    • 如果环境变量MSBUILDDEFAULTTOOLSVERSION 设置为存在的ToolsVersion,请使用它。
    • 如果在MSBuild.exe.config 中设置了DefaultOverrideToolsVersion,请使用它。
    • 如果在注册表中设置了DefaultOverrideToolsVersion,请使用它。
    • 否则,请使用当前的ToolsVersion

【讨论】:

  • 我尝试了所有这些更改,即使我将寄存器上的值更改为将默认版本更改为 14.0,我也更改了 MSBuild.exe.config 但一切都不成功。我的项目具有正确的 ToolsVersion
  • @Heinrich 您还需要确保从“C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\”运行 msbuild.exe (不是来自 C:\Windows\Microsoft.NET\Framework\v4.0.30319)
  • 对我来说路径是"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
【解决方案3】:

您可能正在使用错误的 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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      您必须使用 msbuild 版本 15。

      【讨论】:

      • 这个对我有帮助。我从 TeamCity 收到上述错误。将 MSBuild 版本更改为 15 就可以了。
      【解决方案6】:

      我遇到了这个问题,因为我使用了错误的 msbuild 路径。我使用的是 C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe,它对应于旧版本的 Visual Studio 和 Frameworks,现在我使用 Visual Studio 2019,因此正确的构建路径是 C:\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,具体取决于您要构建的架构。

      【讨论】:

        【解决方案7】:

        我只是猜测您有带字符串插值的代码,但没有 proper build tools

        【讨论】:

        • 其实我在服务器上安装了更高版本的那个工具
        • 这将有助于查看发生错误的代码。
        【解决方案8】:

        我的解决方案是两部分:

        1) 使用 Visual Studio 2015,选择您的 Web 项目,单击 Project 菜单,选择“启用 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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 2019-02-16
          • 1970-01-01
          • 2021-04-21
          • 2019-09-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多