web-dev-qa-db-fra.com

Erreur CS1056: caractère inattendu '$' exécutant le msbuild sur un processus d'intégration continue tfs

J'ai un projet que le framework cible .NET Framework 4.6.1, dans le cadre du processus d'intégration continue sur le fichier tfs, nous avons créé une tâche de génération de solution pour nous assurer que le code est compilé correctement.
Le serveur TFS dispose maintenant de la dernière version du .Net Famework 4.6.2. Sur le registre, valeur de la clé Release du framework.

Sur toutes les autres versions de système d'exploitation: 394806 => .NET Framework 4.6.2

Mais lorsque la compilation est exécutée, cette erreur est générée:

Error CS1056: Unexpected character '$'

Je ne veux pas remplacer l'interpolation de chaîne par le string.Format pour résoudre ce problème, veuillez fournir une autre solution de contournement pour le résoudre.

Dois-je installer quelque chose d'autre sur le serveur TFS?

23
Heinrich

Le problème peut être résolu en installant un paquet Nuget Microsoft.Net.Compilers. Vous trouverez ci-dessous le lien de ma réponse en surbrillance: Le projet fonctionne correctement avec Visual Studio mais échoue à partir de la ligne de commande

Cette fonctionnalité est un sucre syntaxique pour C # 6, essayez d’installer la dernière version version du framework 4.6.2 https://www.Microsoft.com/en-us/download/details.aspx?id=53345

Ensuite, allez dans les propriétés de votre projet et modifiez-le dans l’application option sur le cadre cible pour pointer vers la dernière. Vous n'avez pas besoin de modifiez votre code pour remplacer l'interpolation de chaîne par string.Format pour le corriger. Si vous obtenez toujours cette erreur, En effet, le compilateur qui exécute votre construction n’est pas le dernier version de C #, essayez d’ajouter Microsoft.Net.Compilers, de Nuget et compiler à nouveau, cela devrait résoudre le problème. Si vous voulez éviter de Installez ce paquet, essayez d’ouvrir votre .csproj et jetez un coup d’œil sur le fichier ToolsVersion.that devrait pointer vers la version 12, puis changez-la 14, mais assurez-vous d’avoir installé la dernière version du MSBuild de https://www.Microsoft.com/en-us/download/details.aspx?id=48159 ou rendez-vous dans C:\Program Files (x86)\MSBuild\14.0\Bin, voici ce que vous devriez avoir dossier avec le compilateur csc.exe. Si même cela ne résout pas le problème le problème, puis essayez de suivre ces étapes https://msdn.Microsoft.com/en-us/library/bb383985.aspx .

D'après mon expérience, j'ai résolu ce problème de 3 manières différentes:

1- vient de recevoir le paquet de Nuget

2- installation de Microsoft Build Tools 2015 sur le serveur tfs

3- Le sledgehammer et les dernières options, mais pour moi le meilleur car vous n'avez pas besoin de gérer la dépendance à Nuget, installe la version de Visual Studio sur le serveur tfs sur lequel vous exécutez le processus.

J'espère que cela t'aides

19
Zinov

Après avoir installé MS Build Tools 2015 dans %ProgramFiles%\MSBuild\14.0\bin, vous devez remplacer la version de MSBuild pour le serveur de génération avec la nouvelle valeur (14.0).

Vous devriez lire l'article MSDN (ou cette réponse ), mais TL; DR vos options sont les suivantes:

  • Remplacez la version à l'aide du commutateur /ToolsVersion (ou /tv, en abrégé) lorsque vous générez le projet ou la solution à partir de la ligne de commande: 

    msbuild.exe someproj.proj /tv:14.0 /p:Configuration=Debug
    
  • Remplacez la version en définissant le paramètre ToolsVersion sur la tâche MSBuild

    <MSBuild Projects="myProject.proj"  
        ToolsVersion="14.0"  
        Targets="go" />
    
  • Remplacez la version en définissant la propriété $(Project.ToolsVersion) sur un projet dans une solution. Cela vous permet de construire un projet dans une solution avec un ToolsetVersion différent de celui des autres projets:

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

L'ordre de priorité, du plus haut au plus bas, utilisé pour déterminer le ToolsVersion est le suivant: 

  1. L'attribut ToolsVersion de la tâche MSBuild utilisée pour générer le projet, le cas échéant.
  2. Le commutateur /toolsversion (ou /tv) utilisé dans la commande msbuild.exe, le cas échéant.
  3. Si la variable d'environnement MSBUILDTREATALLTOOLSVERSIONSASCURRENT est définie, utilisez le ToolsVersion actuel.
  4. Si la variable d'environnement MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT est définie et que ToolsVersion défini dans le fichier de projet est supérieur à la valeur actuelle de ToolsVersion, utilisez la valeur actuelle de ToolsVersion.
  5. Si la variable d'environnement MSBUILDLEGACYDEFAULTTOOLSVERSION est définie ou si ToolsVersion n'est pas défini, les étapes suivantes sont utilisées:
    • L'attribut ToolsVersion de l'élément Project du fichier de projet. Si cet attribut n’existe pas, il est supposé être la version actuelle.
    • La version par défaut des outils dans le fichier MSBuild.exe.config.
    • La version des outils par défaut dans le registre. Pour plus d'informations, voir Configurations d'outils standard et personnalisées .
  6. Si la variable d'environnement MSBUILDLEGACYDEFAULTTOOLSVERSION n'est pas définie, les étapes suivantes sont utilisées:
    • Si la variable d'environnement MSBUILDDEFAULTTOOLSVERSION est définie sur un ToolsVersion qui existe, utilisez-la.
    • Si DefaultOverrideToolsVersion est défini dans MSBuild.exe.config, utilisez-le.
    • Si DefaultOverrideToolsVersion est défini dans le registre, utilisez-le.
    • Sinon, utilisez le ToolsVersion actuel.
11
VMAtm

Il se peut que vous construisiez avec le mauvais MSbuild.exe; faites la compilation dans Visual Studio (où cela fonctionne) et vérifiez les journaux dans Output. Il devrait y avoir quelque chose comme:

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

Assurez-vous que vous utilisez MSBuild.exe dans ce répertoire Bin, dans mon cas; 

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

Je suppose que vous avez du code avec des interpolations de chaînes et que vous n'avez pas les outils de construction proper .

0
Paulo Morgado

Microsoft.Net.Compilers n'a pas fonctionné, mais l'installation de DotNetCompilerPlatform de Nuget a fonctionné.

0
Mike Flynn

Ma solution était en 2 parties:

1) À l’aide de Visual Studio 2015, sélectionnez votre projet Web, cliquez sur le menu Projet , sélectionnez "Activer C # 6".

2) J'avais besoin d'ajouter ce qui suit à la fin de mon web.config de production, juste avant la balise de fermeture de la configuration. Notez que les numéros de version peuvent changer à l'avenir, mais il est essentiel de rechercher un texte similaire dans votre développement web.config après l'activation à l'étape 1 et de vous assurer qu'il est transféré en production.

  <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>
0
Tyler Forsythe