错误CS1056:在tfs持续集成过程中运行msbuild的意外字符'$'

问题描述 投票:25回答:7

我有一个框架针对.NET Framework 4.6.1的项目,作为tfs持续集成过程的一部分,我们创建了一个Build Solution任务,以确保代码正确编译。 现在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
7个回答
22
投票

可以修复安装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

然后转到Project属性并更改Target框架上的Application选项以指向最新的。您无需更改代码即可使用string.Format方法替换字符串插值以进行修复。如果您仍然收到此错误,是因为,运行构建的编译器不是C#的最新版本,请尝试从Nuget添加Microsoft.Net.Compilers并再次编译,这应该可以解决问题。如果你想避免安装这个软件包,请尝试打开.csproj并查看ToolsVersion.that应指向版本12,然后将其更改为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版本。

希望这可以帮助


12
投票

在将MS Build tools 2015安装到%ProgramFiles%\MSBuild\14.0\bin之后,您需要使用具有新值的override the MSBuild version for build server14.0)。

您应该阅读MSDN文章(或this answer),但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的优先顺序(从最高到最低)是:

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

7
投票

您可能正在构建错误的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
投票

Microsoft.Net.Compilers没有工作,但是从Nuget安装了DotNetCompilerPlatform


1
投票

我只是猜测你有使用字符串插值的代码而没有proper build tools


1
投票

我的解决方案是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=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>

1
投票

您必须使用msbuild版本15。

© www.soinside.com 2019 - 2024. All rights reserved.