Avatar ·

Ошибка "Could not find part of path ... bin\roslyn\csc.exe" в ASP.NET проекте

Привет, коллеги! Я новичок в C# и ASP.NET, работаю в Visual Studio 2022. Сегодня столкнулся с непонятной ошибкой при запуске веб-приложения. Проект создавался как стандартный ASP.NET MVC, я добавил пару контроллеров и представлений, всё компилировалось нормально. Но после того как я обновил несколько NuGet-пакетов (включая Microsoft.CodeDom.Providers.DotNetCompilerPlatform), проект перестал запускаться. Ошибка появляется на этапе компиляции Razor-представлений прямо в браузере. Вот полный текст: ``` Could not find a part of the path 'C:\Users\MyName\source\repos\MyProject\MyProject\bin\roslyn\csc.exe'. ``` Стек вызова указывает на то, что ошибка возникает в System.IO.__Error.WinIOError. Я проверил папку bin\roslyn — её вообще не существует. Пробовал чистить и пересобирать решение, удалял bin и obj вручную, но ошибка остаётся. В интернете нашёл, что это связано с компилятором Roslyn, который используется для сборки представлений на лету. Но как это исправить? Прилагаю фрагмент моего Web.config, где есть секция compilation: ```xml ``` Помогите разобраться, что я делаю не так? Версии: .NET Framework 4.7.2, Visual Studio 2022 17.8. <<>>

Причина ошибки

Ошибка 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 скопировать все необходимые файлы в проект.

  1. Откройте консоль диспетчера пакетов (Tools → NuGet Package Manager → Package Manager Console).
  2. Выполните команду для удаления пакета:
    Uninstall-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
  3. Затем установите его снова:
    Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
  4. Пересоберите проект (Build → Rebuild Solution).

После этого проверьте, появилась ли папка bin\roslyn. Если нет — переходите к следующему шагу.

Решение 2: Ручное копирование файлов Roslyn

Иногда NuGet не копирует файлы автоматически. Тогда нужно сделать это вручную или настроить скрипт сборки.

  1. Найдите папку с пакетами NuGet. Обычно она находится по пути: C:\Users\[ВашеИмя]\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\[версия]\tools\Roslyn
  2. Скопируйте всё содержимое этой папки (включая csc.exe, vbc.exe и другие файлы) в папку bin\roslyn вашего проекта.
  3. Пересоберите проект.

Если папка 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 проекте:

  1. Установите пакет Microsoft.AspNet.Mvc версии 5.2.7 или выше (если ещё не установлен).
  2. Добавьте в файл Web.config в секцию <appSettings>:
    <add key="webpages:Enabled" value="false" />
  3. Включите предварительную компиляцию в свойствах проекта: щёлкните правой кнопкой по проекту → Properties → Build → поставьте галочку "MVC → Enable precompilation".
  4. Пересоберите проект — все .cshtml файлы будут скомпилированы в одну сборку (обычно App_Web_*.dll).

Важно: Этот подход лишает вас возможности изменять представления без пересборки всего проекта. Если вы разрабатываете в команде или часто правите вёрстку, это может быть неудобно. Однако для production-среды это лучший вариант — он повышает производительность и надёжность.

Также проверьте, не блокирует ли антивирус копирование файлов в папку bin\roslyn. Некоторые антивирусы могут помещать csc.exe в карантин, считая его подозрительным. Временно отключите защиту и повторите сборку.