Prawdopodobnie już to działa, ale może to pomóc komuś innemu w przyszłości. Niedawno natknąłem się na to pytanie, które skłoniło mnie do pójścia we właściwym kierunku i ostatecznie doprowadziło do rozwiązania.
Innym możliwym rozwiązaniem tego problemu jest ręczne aktualizowanie plików projektu, aby były przeznaczone dla wersji programu MSBuild, na podstawie której mają być tworzone projekty.
Niedawno przeszedłem przez aktualizację serwera kompilacji TeamCity i już zainstalowałem na niej Microsoft Build Tools 2015. Wydawało mi się, że mam wszystko na serwerze kompilacji, moje rozwiązanie jest przeznaczone dla języka C # 6.0, a każdy projekt był przeznaczony dla .net 4.6.1. Podobnie jak Ty, wszystko z kodem specyficznym dla C # 6.0 zbudowanym dobrze w moim środowisku lokalnym, ale mój serwer kompilacji TeamCity nie podobał się temu.
Jak wspominali inni, próbowałem użyć pakietu Microsoft.Net.Compilers NuGet. Najnowsza wersja pozwalała na pracę kompilacji na moim serwerze kompilacji, ale nie pozwalała mi publikować kodu lokalnie (moje wymaganie). Wcześniejsze wersje tego pakietu NuGet umożliwiałyby mi publikowanie, ale kompilacja nie działała.
Okazało się, że musiałem ostatecznie zmodyfikować każdy plik projektu w moim rozwiązaniu, aby ukierunkować go na wersję programu MSBuild, która może obsługiwać kod C # 6.0. W każdym z moich plików projektu znalazłem wiersz podobny do następującego:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
kluczowym składnikiem tego wiersza jest jego część ToolsVersion . Po prostu zmieniłem ten wiersz w moich plikach projektu, aby przeczytać następujące informacje:
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Różnica polegała na tym, że celowałem w wersję 14, a nie 4. Wersja 14.0 odpowiada Build Tools 2015. Zmieniając to, mój serwer kompilacji TeamCity używał poprawnej wersji MSBuild i był w stanie zbudować mój kod C # 6.0.
Musiałem również ręcznie zaktualizować węzeł XML TargetFrameworkVersion tego, aby używać 4.6.1, ponieważ VS2015 nie robił czegoś dobrze i zepsuło moją lokalną kompilację, ale to nie ma znaczenia tutaj.
Proszę, ktoś popraw mnie, jeśli się mylę, ale dla odniesienia myślę, że numery wersji wyglądają mniej więcej tak:
4,0 = VS2012
12,0 = VS2013
14,0 = VS2015
15,0 = VS2017
Uważam, że gdybyś chciał używać .net 4.7, musiałbyś mieć zainstalowany Build Tools 2017 i mieć projekty skierowane na 15.0 zamiast 14.0, ale nie zweryfikowałem tego.