Ошибка "Could not find part of path ... bin\roslyn\csc.exe" в ASP.NET проекте
Причина ошибки
Ошибка Could not find a part of the path ... bin\roslyn\csc.exe возникает, когда пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform не может найти исполняемый файл компилятора Roslyn (csc.exe) в папке bin\roslyn. Этот пакет используется для компиляции Razor-представлений во время выполнения (runtime compilation) в ASP.NET проектах на полном .NET Framework. Roslyn — это современный компилятор C# и VB.NET, который заменяет старый csc.exe из .NET SDK.
Проблема обычно возникает после обновления пакета или при неправильной настройке проекта. Пакет ожидает, что файлы компилятора будут скопированы в выходную директорию при сборке, но по разным причинам этого не происходит.
Решение 1: Переустановка пакета через NuGet
Самый простой и часто работающий способ — полностью удалить и заново установить пакет. Это заставит NuGet скопировать все необходимые файлы в проект.
- Откройте консоль диспетчера пакетов (Tools → NuGet Package Manager → Package Manager Console).
- Выполните команду для удаления пакета:
Uninstall-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform - Затем установите его снова:
Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform - Пересоберите проект (Build → Rebuild Solution).
После этого проверьте, появилась ли папка bin\roslyn. Если нет — переходите к следующему шагу.
Решение 2: Ручное копирование файлов Roslyn
Иногда NuGet не копирует файлы автоматически. Тогда нужно сделать это вручную или настроить скрипт сборки.
- Найдите папку с пакетами NuGet. Обычно она находится по пути:
C:\Users\[ВашеИмя]\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\[версия]\tools\Roslyn - Скопируйте всё содержимое этой папки (включая
csc.exe,vbc.exeи другие файлы) в папкуbin\roslynвашего проекта. - Пересоберите проект.
Если папка bin\roslyn не существует — создайте её вручную.
Решение 3: Настройка файла проекта (.csproj)
Добавьте в ваш .csproj файл (откройте его в текстовом редакторе) следующий блок внутри <Project>:
<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild">
<ItemGroup>
<RoslynFiles Include="$(NuGetPackagePath)\microsoft.codedom.providers.dotnetcompilerplatform\*\tools\Roslyn\*" />
</ItemGroup>
<Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(OutputPath)\roslyn" SkipUnchangedFiles="true" />
</Target>
Этот таргет будет копировать файлы Roslyn в папку bin\roslyn после каждой сборки.
Решение 4: Отключение runtime компиляции
Если вам не нужна компиляция представлений во время выполнения (например, вы публикуете сайт с предварительно скомпилированными представлениями), можно отключить эту функцию. Для этого удалите из Web.config секцию <system.codedom>, которую вы привели в вопросе. После этого ошибка исчезнет, но вы потеряете возможность изменять .cshtml файлы на лету.
Дополнительный совет: Убедитесь, что ваш проект использует .NET Framework 4.6.1 или выше, так как Roslyn требует более новые версии. Также проверьте, что в Web.config нет конфликтующих настроек, например, старых ссылок на компилятор.
Если ни одно из решений не помогло, попробуйте создать новый проект с теми же настройками и перенести код — иногда проблема связана с повреждением файлов проекта.
<<Альтернативное решение: Использование предварительной компиляции Razor
Если вы часто сталкиваетесь с этой ошибкой и не хотите каждый раз возиться с Roslyn, можно переключиться на предварительную компиляцию Razor-представлений. Это полностью устраняет зависимость от runtime компиляции и, следовательно, от файла csc.exe в папке bin\roslyn.
Для этого в вашем ASP.NET MVC проекте:
- Установите пакет Microsoft.AspNet.Mvc версии 5.2.7 или выше (если ещё не установлен).
- Добавьте в файл
Web.configв секцию<appSettings>:<add key="webpages:Enabled" value="false" /> - Включите предварительную компиляцию в свойствах проекта: щёлкните правой кнопкой по проекту → Properties → Build → поставьте галочку "MVC → Enable precompilation".
- Пересоберите проект — все .cshtml файлы будут скомпилированы в одну сборку (обычно
App_Web_*.dll).
Важно: Этот подход лишает вас возможности изменять представления без пересборки всего проекта. Если вы разрабатываете в команде или часто правите вёрстку, это может быть неудобно. Однако для production-среды это лучший вариант — он повышает производительность и надёжность.
Также проверьте, не блокирует ли антивирус копирование файлов в папку bin\roslyn. Некоторые антивирусы могут помещать csc.exe в карантин, считая его подозрительным. Временно отключите защиту и повторите сборку.
Ответов пока нет.
Войдите чтобы оставить ответ