Не удалось найти часть пути ... binroslyncsc.исполняемый

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

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

не удалось найти часть пути 'C:B8akWorkspaceB8akProjectB8akSolutionB8AK.Порталbinroslyncsc.exe.

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

enter image description here

после нескольких дней исследований, я понял, что Рослин платформа компилятора .Net, которая предлагает функции предварительной компиляции. Однако я не понимаю, почему моя сборка пытается найти binroslyncsc.exe, потому что я не настраивал ничего, связанного с Roslyn, и я не собираюсь использовать Roslyn в своем проекте.

30 ответов


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

добавьте этот код в свой .файл 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.Сеть.Компиляторы 1.1.1
  • Microsoft.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform 1.0.1

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

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

PM > 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, вы могли заметить, что шаблоны проектов используют Рослин по умолчанию. На самом деле Рослин - одна из открыть-источник компиляторы для языков .NET от Microsoft.

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

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

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

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

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>
      <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>

вот более 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 (не в папке). Приложение, похоже, работает.


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

Edit: комментаторы говорят, что чистый шаг не нужен. Ты можешь просто перестроиться.


и ответ Роба Кэннона по существу работал для меня, но мне пришлось настроить несколько вариантов. В частности, мне пришлось удалить условие на цели, а также изменить атрибут 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>

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

версия 1.0.3 Microsoft.граф CodeDOM.Услуги поставщиков.Пакет DotNetCompilerPlatform Nuget работает для меня, но версия 1.0.6 вызывает ошибку в этом вопросе

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


Это известная проблема С Microsoft.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform 1.0.6. Понижение до 1.0.5 исправило это для меня.


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

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


открыть файл проекта и удалить все ссылки с проектом импорта="..\пакеты\Microsoft.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform.1.0.0....

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


обновление пакетов nuget работало для меня Щелкните правой кнопкой мыши решение > Управление пакетами NuGet для решения и обновите все пакеты и специально: Microsoft.Сеть.Компиляторы и Microsoft.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform


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

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\workDirba9f2e0d5e4022\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\workDirba9f2e0d5e4022\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\workDirba9f2e0d5e4022\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\workDirba9f2e0d5e4022\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#: throw недопустимое выражение compilation) и был решен таким образом (как использовать 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 и rebuild, это должно гарантировать, что все работает и строится правильно.

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


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

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


проблема с шаблонами VS2015 по умолчанию заключается в том, что компилятор фактически не копируется в


Обновление Microsoft.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform от 1.0.0 до 1.0.1 исправил это для меня.


Введите описание изображения здесь

вам необходимо установить Microsoft.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform.BinFix, был специально создан для этой ошибки


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

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

  1. <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" /> от пакеты.файл 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 узел, вы можете понять, почему он приносил в roslyn:compilerOptions="/langversion:6


добавить PropertyGroup к вашему .файл csproj

<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>

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

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

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

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

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

это решило мой проблема.


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

  1. щелкните правой кнопкой мыши в решении
  2. выберите Очистить решение
  3. после того, как clean удалось, снова создайте свой проект
  4. запустите проект еще раз

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


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

Microsoft.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform

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


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


Я столкнулся с этой проблемой после обновления некоторых пакетов через NuGet. Перестроение (вместо обычной сборки) сработало для меня.


У меня была такая же проблема после обновления DotNetCompilerPlatform. Решено путем перезапуска Visual Studio > чистый проект > проект сборки.


мое решение использует Nuget для обновления ниже элементов до последней версии: - Майкрософт.Чистая.Составители - Microsoft.граф CodeDOM.Услуги поставщиков.DotNetCompilerPlatform Затем перестроили проект. Поскольку мой проект является веб-сайтом, поэтому нет *.файл csproj. Выше сообщение об ошибке появляется, когда я пытался просмотреть cshtml в браузере.

ошибка исправлена после того, как два элемента выше обновлены до последней версии. Я нахожусь в VS2015 и windows7 SP1


кроме удаления директории Bin из всех проектов внутри решения, удалите также папки obj.

в главном решении diretory удалите папку .vs

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


У меня есть webproject без файла csproj, и решения, упомянутые здесь, не работали для меня.

изменение целевой платформы .NET framework, переустановка пакетов (Update-Package -reinstall), а затем строительство проекта сработало для меня. Вы даже можете изменить целевую структуру после этой операции (сделайте так, чтобы вы переустановили пакеты nuget снова после этого).


вопрос

имейте в виду, что NuGet PM нарушает поведение Розалин. Нажмите Tools > NuGet Package Manager > Manage NuGet Packages for Solution Если обновление существует для Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Microsoft.Net.Compilers или Microsoft.Net.Compilers.netcore, обновите их, и решение сломается! Это происходит потому, что шаблоны сайтов ASP настроены на использование определенных версий при создании проекта. Чтобы увидеть проблему, нажмите кнопку Показать все файлы в обозревателе решений.

исправить

при создании проекта $(WebProjectOutputDir)\bin не существует, поэтому, когда Розалин добавляется как зависимость от NuGet он устанавливает его правильно. После обновления пакетов решений . Теперь вы можете обновить страницу, и сайт загрузится.


мне пришлось изменить файлы проектов WebAPI и MVC, чтобы не создавать представления:

<MvcBuildViews>false</MvcBuildViews>

это разрешило мою ошибку сервера сборки TFS 2015 с roslyn. Все еще не уверен, почему csc.exe был скопирован в \bin\csc.exe, но процесс публикации искал \bin\Roslyn\csc.исполняемый...не смог найти трансформацию, вызвавшую это несоответствие.


Я испытал эту ошибку на сервере сборки Jenkins под управлением MSBuild, который выводит файлы сборки в отдельную папку (_PublishedWebsites). Точно так же - папка roslyn не была в каталоге bin, и все файлы roslyn были объединены с файлами bin.

@igor-semin ' s answer было единственное, что работало для меня (поскольку я использую языковые функции C# 6, я не могу просто удалить пакеты nuget согласно другим ответам), но как Я также запускаю CodeAnalysis, я получал еще одну ошибку на моем целевом сервере развертывания:

для типа Microsoft была обнаружена попытка переопределить существующее сопоставление.CodeAnalysis.ICompilationUnitSyntax с именем"", в настоящее время сопоставляется с типом Microsoft.CodeAnalysis.Используется CSharp.Синтаксис.CompilationUnitSyntax, чтобы ввести Microsoft.CodeAnalysis.На языке VisualBasic.Синтаксис.CompilationUnitSyntax.

причина этого в том, что, поскольку файлы roslyn сбрасываются в основной каталог bin, когда вы запускаете xcopy, чтобы воссоздать их во вложенной папке roslyn, теперь у вас есть 2 копии этих файлов, которые компилируются, и между ними происходит столкновение. После большого разочарования я решил "взломать" исправление-дополнительную задачу после сборки, чтобы удалить эти файлы из каталога bin, удалив конфликт.

The .csproj моих оскорбительных проектов теперь выглядит так:

................... подробнее здесь ......................

 <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>
<Target Name="DeleteDuplicateAnalysisFiles" AfterTargets="AfterBuild">
   <!-- Jenkins now has copies of the following files in both the bin directory and the 'bin\rosyln' directory. Delete from bin. -->
   <ItemGroup>
     <FilesToDelete Include="$(WebProjectOutputDir)\bin\Microsoft.CodeAnalysis*.dll" />
   </ItemGroup>
   <Delete Files="@(FilesToDelete)" />
</Target>

................... здесь больше ......................