Avatar ·

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

Всем привет! Я новичок в C# и ASP.NET, работаю в Visual Studio 2019. При запуске моего веб-приложения (проект ASP.NET MVC) я внезапно получаю ошибку: ``` Could not find a part of the path 'D:\Projects\MyApp\MyApp\bin\roslyn\csc.exe' ``` Проект раньше работал нормально, но после добавления NuGet пакета Microsoft.CodeDom.Providers.DotNetCompilerPlatform и обновления решения ошибка появляется постоянно. Вот мой код (простой контроллер): ```csharp public class HomeController : Controller { public ActionResult Index() { return View(); } } ``` Я уже пробовал: 1. Очистить и пересобрать решение (Build -> Clean Solution, затем Rebuild). 2. Удалить папку bin и obj вручную. 3. Переустановить Visual Studio (не помогло). Ошибка возникает при компиляции представлений Razor. В папке bin\roslyn действительно нет файла csc.exe. Как это исправить? Помогите, пожалуйста! <<>>

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

Ошибка возникает из-за того, что пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform требует наличия компилятора Roslyn (csc.exe) в папке bin\roslyn вашего проекта. Этот пакет используется для компиляции представлений Razor на лету (runtime compilation). Если файлы компилятора отсутствуют или не скопировались при сборке, вы получаете указанную ошибку.

Решение: очистка и переустановка пакета Roslyn

Самый надёжный способ — удалить и заново установить пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform, а также его зависимость Microsoft.Net.Compilers.

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

После этого папка 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"
      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"
      warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008;40000" />
  </compilers>
</system.codedom>

Альтернативный способ: ручное копирование файлов

Если переустановка не помогла, можно вручную скопировать файлы Roslyn из папки packages вашего решения. Найдите папку:

[Ваше_решение]\packages\Microsoft.Net.Compilers.[версия]\tools

Скопируйте оттуда папку roslyn (со всеми файлами, включая csc.exe) в bin\roslyn вашего проекта. Затем пересоберите решение.

Что делать, если ошибка остаётся?

  • Убедитесь, что у вас установлена последняя версия пакета (на момент написания — 2.0.1 или новее).
  • Проверьте, не заблокирован ли файл csc.exe антивирусом (добавьте папку проекта в исключения).
  • Временно отключите "Enable 64-bit processes for Web Projects" в настройках Visual Studio (Tools -> Options -> Projects and Solutions -> Web Projects).

После выполнения этих шагов ошибка должна исчезнуть, и ваше приложение снова будет работать корректно.

<<>>

Альтернативное решение: отключение runtime компиляции Razor

Если вам не нужна компиляция представлений Razor во время выполнения (например, вы публикуете предварительно скомпилированное приложение), вы можете полностью удалить пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform. Это избавит от необходимости иметь csc.exe в папке bin.

Шаги:

  1. Удалите пакет через NuGet Package Manager:
    Uninstall-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -RemoveDependencies
  2. Удалите из Web.config секцию <system.codedom> (если она осталась).
  3. Пересоберите проект.

Обратите внимание: при таком подходе все изменения в представлениях Razor (cshtml) потребуют полной пересборки проекта, а не просто обновления страницы в браузере. Это подходит для продакшн-среды или когда вы используете предварительную компиляцию.

Если вы всё же хотите оставить runtime компиляцию, но избежать ошибки, попробуйте обновить пакет Microsoft.Net.Compilers до версии 3.6.0 или новее — в новых версиях исправлены проблемы с копированием файлов.