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 tareaMSBuild
:<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 unaToolsetVersion
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:
- El atributo
ToolsVersion
en la tareaMSBuild
usado para construir el proyecto, si lo hay.- El
/toolsversion
(o/tv
) que se usa en el comandomsbuild.exe
, si lo hay.- Si la variable de entorno
MSBUILDTREATALLTOOLSVERSIONSASCURRENT
está configurada, utilice laToolsVersion
actual deToolsVersion
.- Si la variable de entorno
MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT
está establecida y laToolsVersion
definida en el archivo de proyecto es mayor que laToolsVersion
actual, use laToolsVersion
actual.- Si la variable de entorno
MSBUILDLEGACYDEFAULTTOOLSVERSION
está configurada, o siToolsVersion
no está configurada, se usan los siguientes pasos:
- El atributo
ToolsVersion
del elementoProject
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 .
- Si la variable de entorno
MSBUILDLEGACYDEFAULTTOOLSVERSION
no está establecida, se utilizan los siguientes pasos:
- Si la variable de entorno
MSBUILDDEFAULTTOOLSVERSION
se establece en unaToolsVersion
que existe, utilícela.- Si
DefaultOverrideToolsVersion
está configurado enMSBuild.exe.config
, utilícelo.- Si
DefaultOverrideToolsVersion
está configurado en el registro, utilícelo.- De lo contrario, utilice la
ToolsVersion
actual deToolsVersion
.
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=/"Web/" /optionInfer+" />
</compilers>
</system.codedom>
Microsoft.Net.Compilers no funcionó, pero la instalación de DotNetCompilerPlatform desde Nuget sí lo hizo.
Solo estoy adivinando que tienes código con interpolaciones de cadenas y no tienes las microsoft.com/en-us/download/details.aspx?id=48159 .