c# tfs c#-5.0 c#-6.0 .net-framework-version

c# - Error CS1056: Carácter inesperado ''$'' ejecutando msbuild en un proceso de integración continua de tfs



c#-5.0 c#-6.0 (6)

Después de instalar microsoft.com/en-us/download/details.aspx?id=48159 en %ProgramFiles%/MSBuild/14.0/bin , debe https://msdn.microsoft.com/en-us/library/bb383985.aspx con un nuevo valor ( 14.0 ).

Debería leer el artículo de MSDN (o esta respuesta ), pero en TL; DR, sus opciones son:

  • Reemplace la versión usando el interruptor /ToolsVersion (o /tv , para abreviar) cuando compile el proyecto o la solución desde la línea de comando:

    msbuild.exe someproj.proj /tv:14.0 /p:Configuration=Debug

  • Reemplace la versión configurando el parámetro ToolsVersion en la tarea MSBuild :

    <MSBuild Projects="myProject.proj" ToolsVersion="14.0" Targets="go" />

  • Reemplace la versión configurando la propiedad $(Project.ToolsVersion) en un proyecto dentro de una solución. Esto le permite construir un proyecto en una solución con una ToolsetVersion que difiere de la de los otros proyectos:

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

El orden de prioridad, de mayor a menor, utilizado para determinar la ToolsVersion es:

  1. El atributo ToolsVersion en la tarea MSBuild usado para construir el proyecto, si lo hay.
  2. El /toolsversion (o /tv ) que se usa en el comando msbuild.exe , si lo hay.
  3. Si la variable de entorno MSBUILDTREATALLTOOLSVERSIONSASCURRENT está configurada, utilice la ToolsVersion actual de ToolsVersion .
  4. Si la variable de entorno MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT está establecida y la ToolsVersion definida en el archivo de proyecto es mayor que la ToolsVersion actual, use la ToolsVersion actual.
  5. Si la variable de entorno MSBUILDLEGACYDEFAULTTOOLSVERSION está configurada, o si ToolsVersion no está configurada, se usan los siguientes pasos:
    • El atributo ToolsVersion del elemento Project del archivo de proyecto. Si este atributo no existe, se asume que es la versión actual.
    • La versión predeterminada de las herramientas en el archivo MSBuild.exe.config .
    • La versión predeterminada de las herramientas en el registro. Para obtener más información, consulte Configuraciones de conjuntos de herramientas estándar y personalizadas .
  6. Si la variable de entorno MSBUILDLEGACYDEFAULTTOOLSVERSION no está establecida, se utilizan los siguientes pasos:
    • Si la variable de entorno MSBUILDDEFAULTTOOLSVERSION se establece en una ToolsVersion que existe, utilícela.
    • Si DefaultOverrideToolsVersion está configurado en MSBuild.exe.config , utilícelo.
    • Si DefaultOverrideToolsVersion está configurado en el registro, utilícelo.
    • De lo contrario, utilice la ToolsVersion actual de ToolsVersion .

Tengo un proyecto al que el marco se dirige a .NET Framework 4.6.1 , como parte del proceso de integración continua en los tfs, creamos una tarea de Build Solution para asegurar que el código se compile correctamente.
Ahora el servidor TFS tiene la última versión de .Net Famework 4.6.2 . En el registro, este es el valor para la clave de lanzamiento del marco

En todas las demás versiones de SO: 394806 => .NET Framework 4.6.2

Pero cuando la compilación se ejecuta viene con este error:

Error CS1056: Unexpected character ''$''

No quiero reemplazar la cadena de interpolación por la string.Format Para resolver este problema, proporcione otra solución para resolverlo.

¿Necesito instalar algo más en el servidor TFS?


El problema se puede solucionar instalando un paquete Nuget Microsoft.Net.Compilers. A continuación, se encuentra el enlace de mi respuesta resaltada: el proyecto funciona bien con Visual Studio pero falla desde la línea de comandos

Esa característica es un azúcar sintáctico para C # 6, intente instalar la última versión del framework 4.6.2 https://www.microsoft.com/en-us/download/details.aspx?id=53345

Luego, vaya a las propiedades de su Proyecto y cambie la opción de Aplicación en el marco de Target para apuntar a la última. No es necesario cambiar el código para reemplazar la interpolación de cadena por el método de cadena. Formatee para corregirlo. Si aún recibe este error, es porque el compilador que está ejecutando su compilación no es la última versión de C #, intente agregar los compiladores Microsoft.Net de Nuget y compile nuevamente, eso debería resolver el problema. Si desea evitar instalar este paquete, intente abrir su .csproj y eche un vistazo a ToolsVersion.que debería apuntar a la versión 12, luego cámbielo a 14, pero asegúrese de haber instalado la última versión de MSBuild desde microsoft.com/en-us/download/details.aspx?id=48159 o vaya a C: / Archivos de programa (x86) / MSBuild / 14.0 / Bin, ahí debería tener esta carpeta con El compilador csc.exe. Si incluso eso no resuelve el problema, intente seguir estos pasos https://msdn.microsoft.com/en-us/library/bb383985.aspx .

En mi experiencia resolví este problema de 3 maneras diferentes:

1- Acabo de recibir el paquete de Nuget.

2- Instalar Microsoft Build Tools 2015 en el servidor tfs

3- El mazo y las últimas opciones, pero para mí las mejores, porque no necesita lidiar con la dependencia de nuget, es instalar la versión de estudio visual en el servidor tfs donde ejecuta el proceso.

Espero que esto ayude


Existe la posibilidad de que esté compilando con el MSbuild.exe incorrecto; haga la compilación en Visual Studio (donde funciona) y verifique los registros en Salida. Debería haber algo como:

1>Target "GetReferenceAssemblyPaths" in file "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/Microsoft.Common.CurrentVersion.targets"

Asegúrese de que está utilizando el MSBuild.exe en ese directorio Bin, en mi caso;

C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/MSbuild.exe


Mi solución fue 2 partes:

1) Usando Visual Studio 2015, seleccione su proyecto web, haga clic en el menú Proyecto , seleccione "Habilitar C # 6"

2) Necesitaba agregar lo siguiente al final de mi web.config de producción, justo antes de la etiqueta de cierre de configuración. Tenga en cuenta que los números de versión pueden cambiar en el futuro, pero la clave es buscar un texto similar en su web.config de desarrollo después de habilitarlo en el paso 1 y asegurarse de que se transfiera a producción.

<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>


Microsoft.Net.Compilers no funcionó, pero la instalación de DotNetCompilerPlatform desde Nuget sí lo hizo.