找不到路径的一部分... bin \ roslyn \ csc.exe

问题描述 投票:477回答:44

我正在尝试运行从TFS源代码控制中检索的Asp.net MVC项目。我添加了所有程序集引用,我能够成功构建和编译,没有任何错误或警告。

但是我在浏览器中收到以下错误:

找不到路径'C:\ B8akWorkspace \ B8akProject \ B8akSolution \ B8AK.Portal \ bin \ roslyn \ csc.exe'的一部分。

以下是错误页面的完整屏幕截图。

enter image description here

经过几天的研究,我明白Roslyn是.Net编译器平台,提供先进的编译功能。但是,我不明白为什么我的构建试图找到\ bin \ roslyn \ csc.exe,因为我没有配置任何与Roslyn相关的东西,也没打算在我的项目中使用Roslyn。

c# asp.net asp.net-mvc roslyn
44个回答
272
投票

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

10
投票

正如an issue in the Roslyn project on GitHub所述,一个解决方案(对我有用)就是在Visual Studio中简单地卸载和重新加载项目。

在重新加载项目之前,未在构建或重建时创建“bin \ roslyn”文件夹。


9
投票

更新nuget包对我有用右键单击解决方案>管理NuGet包以获得解决方案并更新所有包,特别是:Microsoft.Net.Compilers和Microsoft.CodeDom.Providers.DotNetCompilerPlatform


9
投票

这是known issueMicrosoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.6。降级到1.0.5为我解决了这个问题。


8
投票

在我的情况下,我只需要转到Visual Studio Solution Explorer(Web应用程序项目)中的bin目录并直接包含roslyn项目。通过右键单击该文件夹并选择“包括在项目中”。并再次检查解决方案以触发构建过程。

默认情况下不包含roslyn文件夹。


8
投票

根据Daniel Neel的评论:

版本1.0.3的Microsoft.CodeDom.Providers.DotNetCompilerPlatform Nuget包适用于我,但版本1.0.6导致此问题中的错误

降级到1.0.3为我解决了这个问题。


8
投票
  • 右键单击您的项目,然后选择Manage Nuget Packages
  • 找到“Microsoft.CodeDom.Providers.DotNetCompilerPlatform”
  • 只需更新到较旧或较新版本(无关紧要),然后再次更新回原始版本。

这将重新安装软件包的所有依赖项和文件(如csc.exe)

Nuget - DotNetCompilerPlatform


7
投票

将Microsoft.CodeDom.Providers.DotNetCompilerPlatform从1.0.0升级到1.0.1为我解决了这个问题。


7
投票

在我的情况下,我在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#: throw invalid expression compilation)并以这种方式解决(How to use C# 7 with Visual Studio 2015?)。这导致,当我在主程序上安装组件时,Microsoft.Net.Compilers会自动添加它。

我的工作是,从我们的内部组件卸载以下(按照@malikKhalil回答)

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

并选择了Jenkins中的C#7编译器而不是C#6并重建,这是为了确保一切正常并正确构建。

最后在我的主程序中,我试图更新我的内部组件。而且还有一切都要再建造。它没有任何问题或问题。


6
投票

打开项目文件并删除所有引用与Import Project =“.. \ packages \ Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0 ....

打开web.config并删除所有system.codedom编译器属性


5
投票

如果你要添加ASPNETCOMPILER来编译MVC中的Razor视图,比如在this StackOverflow question中,那么将PhysicalPath更改为Roslyn nuget包所在的位置(通常通过$ CscToolPath变量指向):

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


663
投票

在我的情况下,解决方案是重新安装/升级Nuget包:

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

然后我查看.csproj并确保包的路径是正确的(在我的情况下.. \ .. \ packages \ *。*)在顶部的标签<ImportProject>和底部的名称为“EnsureNuGetPackageBuildImports”的<Target>中。这是在MVC 5和.NET Framework 4.5.2上。

简短回答 - 在Package Manager控制台中运行:

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


5
投票

默认VS2015模板的问题在于编译器实际上并未复制到{outdir}_PublishedWebsites\tfr\bin\roslyn\目录,而是复制到{outdir}\roslyn\目录。这可能与您的本地环境不同,因为AppHarbor使用输出目录构建应用程序,而不是“就地”构建解决方案。

要修复它,在xml块.csproj之后立即向<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


5
投票
  1. 清洁解决方案
  2. 重建解决方案,这两个步骤对我有用。

4
投票

在我的例子中,类似于Basim,有一个NuGet包告诉编译器我们需要C#6,我们没有。

我们不得不删除然后删除的NuGet包Microsoft.CodeDom.Providers.DotNetCompilerPlatform

  1. 来自packages.config文件的<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" />
  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


4
投票

我在运行项目时遇到了同样的问题。这是我遵循的步骤。

  1. 右键单击解决方案
  2. 选择清洁溶液
  3. 清理成功后,再次构建您的项目
  4. 再次运行该项目 这次我看不出同样的错误。这按预期工作

3
投票

当在localhost上完美运行时,我在服务器上安装应用程序时遇到了同样的问题。

这些解决方案都没有,我总是有同样的错误:

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中的所有文件

这解决了我的问题。


3
投票

除了从解决方案内的所有项目中删除Bin目录之外,还要删除obj文件夹。

在主解决方案目录中删除文件夹.vs

在尝试将已经完成的项目带入在git上创建的空白解决方案时,为我工作。


3
投票

我有没有csproj文件的web项目,这里提到的解决方案对我不起作用。

更改目标.NET框架,重新安装软件包(Update-Package -reinstall),然后构建项目为我工作。您甚至可以在此操作之后更改目标框架(稍后再重新安装nuget软件包)。


3
投票

在我的情况下,只删除bin文件夹中的所有内容并重新编译为我做了所有的工作。

祝所有有这个问题的人好运。


2
投票

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

2
投票

删除解决方案资源管理器中的Bin文件夹并再次构建解决方案。那样可以解决问题


147
投票

你的构建试图找到\bin\roslyn\csc.exe,因为你的项目中已添加了以下包。只需查看你的packages.config文件,你可以在那里找到它们

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

什么是Roslyn和谁在项目中添加它们(包):如果您使用.net Framework 4.5.2使用VS2015创建项目,您可能已经注意到项目模板默认使用Roslyn。实际上,Roslyn是Microsoft的.NET语言的open-source编译器之一。

我们为什么要删除Roslyn:如果您的项目有Roslyn引用并且您有兴趣部署它没有服务器,那么您将在网站上收到不需要的错误,因为许多托管服务提供商仍然没有升级其服务器,因此不支持Roslyn。要解决此问题问题,您需要从项目模板中删除Roslyn编译器。

如果您对使用Roslyn不感兴趣,请按照以下步骤删除它

1.删​​除Nuget包,使用Nuget Package Console中的以下命令

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

我通过NuGet更新了一些软件包后遇到了这个问题。重建(而不是正常构建)对我有用。


74
投票

清洁和重建对我有用!


55
投票

这是一个更多的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目录中(不在文件夹中)。该应用程序似乎工作。


16
投票

尝试了所有没有雪茄的修复后,我通过在Visual Studios中更新这个Nuget包来修复它:

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

我从1.0.0到2.0.0作为参考(错误不再显示)


16
投票

您需要安装Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix,特别为该错误创建


13
投票

我按照这些步骤完成了它

  • 删除所有bin和obj文件夹
  • 清洁解决方案并重建
  • 在powershell中运行此命令

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


11
投票

所以,Rob Cannon's answer基本上对我有用,但我不得不调整一些选项。具体来说,我必须删除目标上的条件,以及更改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>
© www.soinside.com 2019 - 2024. All rights reserved.