Почему C# кричит про csc.exe в bin\roslyn? Топ-5 ошибок и решения

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Знакомый незнакомец из папки bin

Вы запускаете свой проект на C#, пьёте кофе, предвкушая очередной успешный деплой, и вдруг — бам! — в логах или в браузере появляется пугающая красная надпись: Could not find a part of the path '...\bin\roslyn\csc.exe'. Знакомо? Если вы хоть раз сталкивались с ошибкой csc.exe, то знаете: это не просто «что-то сломалось», а целая история про то, как .NET компилирует ваш код на лету.

На самом деле, за этой ошибкой стоит не злой рок, а банальные технические нюансы. Давайте разберёмся, почему bin\roslyn\csc.exe вдруг «пропадает» и как с этим бороться раз и навсегда. Статья будет полезна как новичкам, которые впервые видят эту ошибку в ASP.NET, так и опытным разработчикам, которые устали чинить её вручную.

Что такое этот загадочный csc.exe и зачем он нужен?

Прежде чем кидаться в бой, давайте разберёмся с теорией. Csc.exe — это компилятор C# из состава .NET Framework. Раньше он жил где-то в недрах системы, но с выходом Roslyn (открытая платформа компиляторов от Microsoft) всё изменилось. Теперь в проектах ASP.NET (особенно старых, на .NET Framework) используется пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform. Он копирует свежие версии компилятора прямо в папку вашего проекта — в bin\roslyn\csc.exe.

Зачем? Чтобы сайт мог компилировать C#-код прямо на сервере (например, для динамических представлений Razor). Если этот файл пропал, повреждён или не скопировался — вы получаете ту самую ошибку пути к csc.exe.

Топ-5 причин ошибки и как их исправить

1. «Мусор» в папках bin и obj (самая частая причина)

Самый популярный сценарий: вы обновили пакеты, поменяли версию .NET, или просто проект «засорился» старыми сборками. Папки bin и obj хранят кэш компиляции, и если там остались битые ссылки на старые версии Roslyn — привет, ошибка.

Решение: Очистите проект «в хлам».

// Закройте Visual Studio
// Вручную удалите папки bin и obj во всём решении
// Или используйте консоль диспетчера пакетов:
Update-Package –reinstall Microsoft.CodeDom.Providers.DotNetCompilerPlatform

После этого пересоберите проект (Build → Rebuild Solution). Система заново скопирует csc.exe из NuGet-пакета в нужную папку.

2. Конфликт версий NuGet-пакетов

Иногда вы случайно обновляете Microsoft.CodeDom.Providers.DotNetCompilerPlatform до версии, которая несовместима с вашим проектом. Или, наоборот, старый пакет не находит новый Roslyn.

Решение: Переустановите пакет принудительно.

// В консоли диспетчера пакетов (Tools → NuGet Package Manager → Package Manager Console)
Uninstall-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Force
Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Обратите внимание: если ваш проект использует .NET Framework 4.7.2 или ниже, лучше устанавливать версию пакета 2.0.1 (более новые могут требовать .NET 4.8+).

3. Кривой web.config или ручные правки

В файле web.config есть секция <system.codedom>, которая указывает, какой компилятор использовать. Если вы (или какой-то плагин) случайно удалили или изменили эту секцию — bin\roslyn\csc.exe перестанет подключаться.

Решение: Проверьте web.config. Правильная конфигурация выглядит так:

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs"
            type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.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=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008,40000,40008" />
    </compilers>
</system.codedom>

Если секции нет — добавьте её. Если есть, но версии не совпадают — приведите к тем, что указаны в вашем packages.config или файле проекта.

4. Проблемы с правами доступа или антивирусом

Иногда ошибка "Could not find a part of the path" возникает не потому, что файла нет, а потому что ваше приложение (пул IIS) не может его прочитать. Это бывает, если вы запускаете сайт под учётной записью с ограниченными правами, или антивирус «съел» подозрительный csc.exe (да, антивирусы иногда считают компиляторы угрозой).

Решение:

  • Дайте полный доступ к папке bin\roslyn для пользователя IIS_IUSRS или NETWORK SERVICE.
  • Проверьте карантин антивируса и добавьте папку проекта в исключения.
  • Если сайт работает под IIS Express — попробуйте запустить Visual Studio от имени администратора.

5. Случайное удаление или неполное копирование при деплое

Вы заливаете сайт на хостинг через FTP, но забыли включить скрытые файлы? Или система деплоя (например, Web Deploy) не скопировала папку roslyn, потому что она помечена как «не для публикации»? Вуаля — ошибка на продакшене.

Решение:

  • Убедитесь, что при публикации выбрана опция «Удалить все существующие файлы перед публикацией» — это перезапишет все битые ссылки.
  • В файле .pubxml (профиль публикации)

Блоги

Рекомендаций по книгам