Ich habe ein Projekt, auf das das Framework auf .NET Framework 4.6.1
abzielt. Als Teil des kontinuierlichen Integrationsprozesses für die tfs haben wir eine Build Solution-Task erstellt, um sicherzustellen, dass der Code korrekt kompiliert wird.
Der TFS-Server verfügt jetzt über die neueste Version von .Net Famework 4.6.2
. Im Register ist dies der Wert für den Freigabeschlüssel des Frameworks
Bei allen anderen Betriebssystemversionen: 394806 => .NET Framework 4.6.2
Wenn der Build jedoch ausgeführt wird, kommt dieser Fehler:
Error CS1056: Unexpected character '$'
Ich möchte die Zeichenfolgeninterpolation nicht durch string.Format
ersetzen, um dieses Problem zu lösen. Bitte geben Sie eine andere Problemumgehung an, um das Problem zu lösen.
Muss ich noch etwas auf dem TFS-Server installieren?
Das Problem kann behoben werden, wenn ein Nuget-Paket Microsoft.Net.Compilers installiert wird. Nachfolgend finden Sie den Link meiner hervorgehobenen Antwort: Project kann mit Visual Studio erstellt werden, schlägt jedoch über die Befehlszeile aus
Diese Funktion ist ein syntaktischer Zucker für C # 6. Versuchen Sie, das neueste .__ zu installieren. Version des Frameworks 4.6.2 https://www.Microsoft.com/de-de/download/details.aspx?id=53345
Gehen Sie dann zu Ihren Projekteigenschaften und ändern Sie in der Anwendung Option auf Target Framework, um auf das neueste zu zeigen. Sie müssen nicht Ändern Sie Ihren Code, um die String-Interpolation durch .__ zu ersetzen. string.Format-Methode, um das Problem zu beheben. Wenn Sie diesen Fehler immer noch erhalten, wird Der Compiler, auf dem Ihr Build ausgeführt wird, ist nicht der neueste Version von C #, versuchen Sie, die Microsoft.Net.Compilers von Nuget und .__ hinzuzufügen. erneut kompilieren, das sollte das Problem beheben. Wenn Sie vermeiden möchten, __. Installieren Sie dieses Paket, versuchen Sie, Ihre .csproj zu öffnen, und werfen Sie einen Blick auf die ToolsVersion.Dies sollte auf die Version 12 zeigen und diese dann ändern bis 14, aber stellen Sie sicher, dass Sie die neueste Version von .__ installiert haben. MSBuild von https://www.Microsoft.com/de-de/download/details.aspx?id=48159 oder go in C:\Programme (x86)\MSBuild\14.0\Bin, dort sollten Sie diese .__ haben. Ordner mit dem Compiler csc.exe. Wenn auch dann das nicht aufgelöst wird versuchen Sie dann, diese Schritte auszuführen https://msdn.Microsoft.com/de-de/library/bb383985.aspx .
Nach meiner Erfahrung habe ich dieses Problem auf 3 verschiedene Arten gelöst:
1- Nur das Paket von Nuget bekommen
2- Installieren von Microsoft Build Tools 2015 auf dem tfs-Server
3- Der Vorschlaghammer und die letzten Optionen, aber für mich die beste, weil Sie sich nicht mit der Abhängigkeit von Nuget beschäftigen müssen, ist die Installation der Visual Studio-Version auf dem TFS-Server, auf dem Sie den Prozess ausführen.
Hoffe das hilft
Nach der Installation der MS Build-Tools 2015 in %ProgramFiles%\MSBuild\14.0\bin
müssen Sie die MSBuild-Version für Build Server mit dem neuen Wert (14.0
) überschreiben.
Sie sollten den MSDN-Artikel lesen (oder diese Antwort ), aber TL; DR Ihre Optionen sind:
Überschreiben Sie die Version mithilfe des Befehls /ToolsVersion
(oder kurz /tv
), wenn Sie das Projekt oder die Projektmappe von der Befehlszeile aus erstellen:
msbuild.exe someproj.proj /tv:14.0 /p:Configuration=Debug
Überschreiben Sie die Version, indem Sie den Parameter ToolsVersion
für die Task MSBuild
festlegen:
<MSBuild Projects="myProject.proj"
ToolsVersion="14.0"
Targets="go" />
Überschreiben Sie die Version, indem Sie die Eigenschaft $(Project.ToolsVersion)
für ein Projekt in einer Lösung festlegen. Dadurch können Sie ein Projekt in einer Lösung mit einem ToolsetVersion
erstellen, das sich von dem der anderen Projekte unterscheidet:
<Project ToolsVersion="14.0" ... </Project>
Die Prioritätsreihenfolge (vom höchsten zum niedrigsten), die zur Bestimmung von
ToolsVersion
verwendet wird, lautet:
- Das
ToolsVersion
-Attribut derMSBuild
-Task, die zum Erstellen des Projekts verwendet wird, sofern vorhanden.- Der
/toolsversion
(oder/tv
) Schalter, der im Befehlmsbuild.exe
verwendet wird, sofern vorhanden.- Wenn die Umgebungsvariable
MSBUILDTREATALLTOOLSVERSIONSASCURRENT
gesetzt ist, verwenden Sie die aktuelleToolsVersion
.- Wenn die Umgebungsvariable
MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT
gesetzt ist und die in der Projektdatei definierteToolsVersion
größer als die aktuelleToolsVersion
ist, verwenden Sie die aktuelleToolsVersion
.- Wenn die Umgebungsvariable
MSBUILDLEGACYDEFAULTTOOLSVERSION
gesetzt ist oder wennToolsVersion
nicht festgelegt ist, werden die folgenden Schritte verwendet:
- Das
ToolsVersion
-Attribut desProject
- Elements der Projektdatei. Wenn dieses Attribut nicht vorhanden ist, wird davon ausgegangen, dass es sich um die aktuelle Version handelt.- Die Standardwerkzeugversion in der
MSBuild.exe.config
-Datei.- Die Standardwerkzeugversion in der Registrierung. Weitere Informationen finden Sie unter Standard- und benutzerdefinierte Toolset-Konfigurationen .
- Wenn die Umgebungsvariable
MSBUILDLEGACYDEFAULTTOOLSVERSION
nicht festgelegt ist, werden die folgenden Schritte verwendet:
- Wenn die Umgebungsvariable
MSBUILDDEFAULTTOOLSVERSION
auf einen vorhandenenToolsVersion
gesetzt ist, verwenden Sie sie.- Wenn
DefaultOverrideToolsVersion
inMSBuild.exe.config
eingestellt ist, verwenden Sie es.- Wenn
DefaultOverrideToolsVersion
in der Registrierung festgelegt ist, verwenden Sie es.- Andernfalls verwenden Sie die aktuelle
ToolsVersion
.
Es besteht die Möglichkeit, dass Sie mit der falschen MSbuild.exe arbeiten. Kompilieren Sie in Visual Studio (wo es funktioniert) und überprüfen Sie die Protokolle in Ausgabe. Es sollte so etwas geben:
1>Target "GetReferenceAssemblyPaths" in file "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets"
Stellen Sie in meinem Fall sicher, dass Sie MSBuild.exe in diesem Bin-Verzeichnis verwenden.
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSbuild.exe
Sie müssen msbuild Version 15 verwenden.
Ich vermute nur, dass Sie Code mit String-Interpolationen haben und nicht die richtigen Build-Tools haben.
Microsoft.Net.Compilers funktionierte nicht, aber die Installation von DotNetCompilerPlatform von Nuget erfolgte.
Meine Lösung bestand aus 2 Teilen:
1) Wählen Sie in Visual Studio 2015 Ihr Webprojekt aus, klicken Sie auf das Menü Project , wählen Sie "Enable C # 6".
2) Ich musste am Ende meiner Produktion web.config, kurz vor dem Tag zum Schließen der Konfiguration, Folgendes hinzufügen. Beachten Sie, dass sich die Versionsnummern in der Zukunft ändern können. Der Schlüssel besteht jedoch darin, nach der Aktivierung in Schritt 1 nach ähnlichem Text in Ihrer Entwicklungsdatei web.config zu suchen und sicherzustellen, dass er in die Produktion übernommen wird.
<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>