Не удалось найти часть пути... bin\roslyn\csc.exe

Я пытаюсь запустить проект Asp.net MVC, полученный из системы контроля версий TFS. Я добавил все ссылки на сборки и смог успешно собрать и скомпилировать без каких-либо ошибок или предупреждений.

Но я получаю следующую ошибку в браузере:

Не удалось найти часть пути 'C:\B8akWorkspace\B8akProject\B8akSolution\B8AK.Portal\bin\roslyn\csc.exe'.

Вот полный скриншот страницы ошибки.

После нескольких дней исследований я понял, что Roslyn - это платформа компилятора.Net, которая предлагает расширенные возможности компиляции. Однако я не понимаю, почему моя сборка пытается найти \ bin \ roslyn \ csc.exe, потому что я не настроил ничего, связанного с Roslyn, и не собираюсь использовать Roslyn в своем проекте.

61 ответ

Решение

Проблема с шаблонами VS2015 по умолчанию заключается в том, что компилятор фактически не копируется в каталог tfr\bin\roslyn\, а скорее в каталог {outdir}\roslyn\

Добавьте этот код в ваш файл.csproj:

<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild" Condition="!$(Disable_CopyWebApplication) And '$(OutDir)' != '$(OutputPath)'">
    <ItemGroup>
      <RoslynFiles Include="$(CscToolPath)\*" />
    </ItemGroup>
    <MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
    <Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>

В моем случае решение было переустановить / обновить пакеты Nuget:

  • Microsoft.Net.Compilers 1.1.1
  • Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.1

Затем я посмотрел в.csproj и убедился, что пути к пакетам верны (в моем случае..\..\packages\*.*) Внутри тегов. <ImportProject> сверху и внутри <Target> с именем "EnsureNuGetPackageBuildImports" внизу. Это на MVC 5 и.NET Framework 4.5.2.

Краткий ответ - запустите это в консоли диспетчера пакетов:

Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r

Чистый и ремонт работал для меня!

Редактировать: комментаторы говорят, что чистый шаг не является необходимым. Вы можете просто восстановить.

Ваш билд пытается найти \bin\roslyn\csc.exe потому что следующие пакеты были добавлены в ваш проект. Просто проверьте вас packages.config файл, вы можете иметь их обоих там

Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Microsoft.Net.Compilers

Что такое Roslyn и кто добавил их (пакеты) в проект: Если вы используете.net Framework 4.5.2 для создания проектов с использованием VS2015, вы могли заметить, что шаблоны проектов используют Roslyn по умолчанию. На самом деле Roslyn является одним из компиляторов с открытым исходным кодом для языков.NET от Microsoft.

Почему мы должны удалить Roslyn: Если ваш проект имеет ссылки на Roslyn, и вы заинтересованы в его развертывании без сервера, вы получите нежелательные ошибки на сайте, так как многие хостинг-провайдеры все еще не обновили свои серверы и, следовательно, не поддерживают Roslyn. вопрос, вам нужно будет удалить компилятор Roslyn из шаблона проекта.

Если вы не заинтересованы в использовании Roslyn,следуйте инструкциям ниже, чтобы удалить его

1. Удалите пакеты Nuget, используйте следующие команды из консоли пакетов Nuget

PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers

2. После этого ваш файл web.config должен быть автоматически обновлен. Если это не так, найдите приведенный ниже код в файле web.config и, если он найден, удалите этот фрагмент кода.

<system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"></compiler>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"></compiler>
    </compilers>
</system.codedom>

Слишком поздно для ответа, но все же публикация сообщений, если это кому-то поможет.
Следуя приведенным ниже инструкциям, я исправил ошибку:

  1. удалить папку пакетов
  2. открыть VS
  3. перестроить
  4. обратите внимание, что пакеты NuGet восстанавливаются, но bin\roslyn не создается
  5. выгрузить проект
  6. перезагрузить проект
  7. перестроить
  8. обратите внимание, что bin\roslyn был создан.

Как уже отмечалось в /questions/7022070/ne-udalos-najti-chast-puti-binroslyncscexe, быстрое исправление заключается в использовании диспетчера пакетов, Tools > Nuget Package Manager > Package Manager Console, бежать

Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r

Но альтернативное решение (которое автоматически и незаметно воссоздает ваши пакеты, если они отсутствуют) - удалить атрибут вашего проекта. Web.configфайл.
(Web.config находится в том же каталоге, что и ваш .csproj файл.)

Открыть Web.configфайл в текстовом редакторе (или внутри Visual Studio).
- В тегеconfiguration > system.codedom > compilers > compiler language="c#;cs;csharp", полностью удалите type атрибут.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- ... -->
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>
</configuration>

Короче говоря, удалите строку, начинающуюся с type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.

(Предположительно, одно и то же исправление работает как для Visual Basic, так и для Csharp, но я его не пробовал.)

Об остальном позаботится Visual Studio. Больше не надоServer Error in '/' Application.

В примере кода, который я предоставил в zip-файле выше, вы теперь получите HTTP Error 403 когда вы нажимаете Ctrl+F5.

Попробуйте заменить http://localhost:64195 в вашем веб-браузере с http://localhost:64195/api/products.
Теперь веб-API отображается так, как должно:

В качестве провокации я попытался удалить все packageкаталог моего решения Visual Studio.
Он был автоматически и незаметно воссоздан, как только я (пере) построил его.


И последнее, но не менее важное: вот код, который воспроизводит ошибку: http://schulze.000webhostapp.com/vs/SrvrErr-reproduce.zip (первоначально из https://github.com/aspnet/AspNetDocs/tree/master/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client/sample/server/ProductsApp)

Вот более MSBuild способ сделать это.

<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild" Condition="!$(Disable_CopyWebApplication) And '$(OutDir)' != '$(OutputPath)'">
    <ItemGroup>
      <RoslynFiles Include="$(CscToolPath)\*" />
    </ItemGroup>
    <MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
    <Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>

Но я заметил, что файлы roslyn также находятся в моей папке bin (не в папке). Приложение, кажется, работает, хотя.

Как отмечалось в проблеме в проекте Roslyn на GitHub, решение (которое сработало для меня) заключается в простой выгрузке и перезагрузке проекта в Visual Studio.

Папка "bin\roslyn" не создавалась при сборке или перестройке, пока я не перезагрузил проект.

Я следовал за этими шагами, и это работало отлично

  • Удалить все папки bin и obj
  • Чистое решение и восстановление
  • Запустите эту команду в powershell

Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r

У меня также была такая же проблема при запуске проекта. Вот шаги, которые я следовал.

  1. Щелкните правой кнопкой мыши в решении
  2. выберите Чистый раствор
  3. После того, как очистка удалась, снова построить свой проект
  4. Запустите проект снова

    На этот раз я не вижу ту же ошибку. Это работает как ожидалось

  1. Чистый раствор
  2. Перестройте решение, эти два шага сработали для меня.

Попробовав все исправления без сигары, я исправил это, обновив этот пакет Nuget в Visual Studios:

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Мой был с 1.0.0 до 2.0.0 для справки (ошибка больше не показывает)

NuGet Package Manager

Вам нужно установить Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix, специально созданный для этой ошибки

  • Щелкните правой кнопкой мыши по своему проекту и выберите "Управление пакетами Nuget".
  • Найти "Microsoft.CodeDom.Providers.DotNetCompilerPlatform"
  • Просто обновите до более старой или более новой версии (неважно, какую), а затем снова обновите до исходной версии.

Это переустанавливает все зависимости и файлы пакета (например, csc.exe)

Для VS 2019 полностью удалите следующий узел:

<system.codedom>
</system.codedom>

В моем случае, прежде чем пробовать какое-либо другое решение, я переключился на конфигурацию "Release", перестроил (папка была создана), а затем снова переключился на "Debug", при этом папка осталась нетронутой.

Это была проверка из системы управления версиями более старого решения, и, по-видимому, исходное (автоматическое) восстановление пакета и сборка проекта не создавали эту папку в каталоге bin.

Обратите внимание, что на момент написания этого обвиняемый компонент достиг версии 2.

Обновление пакетов nuget помогло мне. Щелкните правой кнопкой мыши решение> Управление пакетами NuGet для решения и обновите все пакеты, в частности:Microsoft.Net.Compilers и Microsoft.CodeDom.Providers.DotNetCompilerPlatform.

Это известная проблема с https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.6. Понижение до 1.0.5 исправило это для меня.

Таким образом, ответ Роба Кэннона по существу сработал для меня, но мне пришлось настроить несколько вариантов. В частности, мне пришлось удалить условие на цели, а также изменить атрибут Include, так как $CscToolPath был пуст при создании проекта на нашем сервере сборки. Любопытно, что $CscToolPath не был пустым при локальном запуске.

<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild" >
  <ItemGroup>
    <RoslynFiles Include="$(SolutionDir)packages\Microsoft.Net.Compilers.1.1.1\tools\*" />
  </ItemGroup>
  <MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
  <Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>

В моем случае у меня была проблема в Jenkins, когда он пытался развернуть его в Octopus со следующей ошибкой:

MSBUILD : OctoPack error OCT-1676060969: Failed to build the path for '\bin\roslyn\csc.exe' relative to 'T:\workspace\machine.engine\Machine.engine.Test': Invalid URI: The format of the URI could not be determined.. See the inner exception for more details. [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969: System.Exception: Failed to build the path for '\bin\roslyn\csc.exe' relative to 'T:\workspace\machine.engine\Machine.engine.Test': Invalid URI: The format of the URI could not be determined.. See the inner exception for more details. ---> System.UriFormatException: Invalid URI: The format of the URI could not be determined. [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind) [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at System.Uri..ctor(String uriString) [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at OctoPack.Tasks.Util.OctopusPhysicalFileSystem.GetPathRelativeTo(String fullPath, String relativeTo) in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\Util\OctopusPhysicalFileSystem.cs:line 211 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    --- End of inner exception stack trace --- [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at OctoPack.Tasks.Util.OctopusPhysicalFileSystem.GetPathRelativeTo(String fullPath, String relativeTo) in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\Util\OctopusPhysicalFileSystem.cs:line 224 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at OctoPack.Tasks.CreateOctoPackPackage.AddFiles(XContainer nuSpec, IEnumerable`1 sourceFiles, String sourceBaseDirectory, String targetDirectory, String relativeTo) in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\CreateOctoPackPackage.cs:line 443 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at OctoPack.Tasks.CreateOctoPackPackage.Execute() in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\CreateOctoPackPackage.cs:line 190 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
Done Building Project "T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj" (default targets) -- FAILED

причина

Потратив некоторое время, я использовал внутренний разработанный компонент, который использовал Microsoft.Net.Compilers, Причиной использования внутреннего компонента Microsoft.Net.Compilers Был преодолеть эту проблему ( C#: бросить недопустимую компиляцию выражений) и был решен таким образом ( Как использовать C# 7 с Visual Studio 2015?). Это приводит к тому, что, когда я установил компетентного в основной программе, Microsoft.Net.Compilers добавить себя автоматически.

Решение

Мой обходной путь заключался в том, чтобы удалить следующее из нашего внутреннего компонента (после ответа @malikKhalil)

PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers

И выбрал компилятор C# 7 в Jenkins вместо C# 6 и пересобрал, чтобы убедиться, что все работает и собирается правильно.

Затем, наконец, в своей основной программе я попытался обновить свой внутренний компонент. И все, чем строить снова. Он построен без каких-либо проблем или проблем.

За комментарий Даниэля Нила выше:

Версия 1.0.3 пакета Nuget для Microsoft.CodeDom.Providers.DotNetCompilerPlatform работает для меня, но версия 1.0.6 вызывает ошибку в этом вопросе

Понижение до 1.0.3 решило эту проблему для меня.

Обновление Microsoft.CodeDom.Providers.DotNetCompilerPlatform с 1.0.0 до 1.0.1 исправило это для меня.

В моем случае мне просто нужно было перейти в каталог bin в Visual Studio Solution Explorer (проект веб-приложения) и напрямую включить проект roslyn. Щелкнув правой кнопкой мыши по папке и выбрав Включить в проект. И снова проверьте решение, чтобы запустить процесс сборки.

Папка roslyn не была включена по умолчанию.

В моем случае, просто удалив все из папки bin и перекомпилировав, все сделал за меня.

Удачи всем, кто имеет эту проблему.

Если вы добавляете ASPNETCOMPILER для компиляции ваших представлений Razor в MVC, как в этом вопросе Stackru, то измените PhysicalPath, чтобы он размещал место, где находится пакет Nuget Roslyn (обычно указываемый через переменную $CscToolPath):

<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(CscToolPath)" />

Откройте файл проекта и удалите все ссылки с помощью команды Импорт проекта ="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0....

Откройте web.config и удалите все атрибуты компиляторов system.codedom

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

Ни одно из этих решений не сработало, у меня всегда была одна и та же ошибка:

Could not find a part of the path 'C:\inetpub\wwwroot\myApp\bin\roslyn\csc.exe'

Я закончил тем, что сделал это:

  • в моем проекте установки, щелкните правой кнопкой мыши, просмотр> файловая система
  • создать bin/roslyn папка
  • выберите добавить> файлы и добавить все файлы из packages\Microsoft.Net.Compilers.1.3.2\tools

Это решило мою проблему.

Проблема с шаблонами VS2015 по умолчанию заключается в том, что компилятор фактически не копируется в {outdir}_PublishedWebsites\tfr\bin\roslyn\ каталог, а точнее {outdir}\roslyn\ каталог. Это, вероятно, отличается от вашей местной среды, так как AppHarbor создает приложения с использованием выходного каталога вместо построения решения "на месте".

Чтобы исправить это, добавьте следующее к концу .csproj файл сразу после блока xml <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">...</Target>

<PropertyGroup>
  <PostBuildEvent>
    if not exist "$(WebProjectOutputDir)\bin\Roslyn" md "$(WebProjectOutputDir)\bin\Roslyn"
    start /MIN xcopy /s /y /R "$(OutDir)roslyn\*.*" "$(WebProjectOutputDir)\bin\Roslyn"
  </PostBuildEvent>
</PropertyGroup>

Ссылка: https://support.appharbor.com/discussions/problems/78633-cant-build-aspnet-mvc-project-generated-from-vstudio-2015-enterprise

В моем случае, как и в Basim, был пакет NuGet, который сообщал компилятору, что нам нужен C# 6, а мы этого не делали.

Нам пришлось удалить пакет NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatform который затем удалил:

  1. <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" /> из файла packages.config
  2. <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.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=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" /> </compilers> </system.codedom>

в system.codedom узел, вы можете увидеть, почему он привел в Рослин: compilerOptions="/langversion:6

Удалите папку Bin в обозревателе решений и снова создайте решение. Это решило бы проблему

Другие вопросы по тегам