无法findpath的一部分… bin \ roslyn \ csc.exe

我想运行从TFS源代码pipe理检索到的Asp.net MVC项目。 我已经添加了所有的程序集引用,并且能够在没有任何错误或警告的情况下成功编译和编译。

但是在浏览器中出现以下错误:

无法findpath'C:\ B8akWorkspace \ B8akProject \ B8akSolution \ B8AK.Portal \ bin \ roslyn \ csc.exe'的一部分。

这里是错误页面的完整截图。

在这里输入图像描述

经过几天的研究,我明白了Roslyn是.Net编译器平台,它提供了先进的编译function。 但是,我不明白为什么我的版本试图find\ bin \ roslyn \ csc.exe,因为我没有configuration任何与Roslyn相关的东西,也不打算在我的项目中使用Roslyn。

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

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

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

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

简短的回答 – 在包pipe理器控制台中运行:

PM > update-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r

你的版本试图find\bin\roslyn\csc.exe因为下面的软件包已经被添加到你的项目中了。只要检查你的packages.config文件,你就可以把它们放在那里

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

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

我们为什么要删除Roslyn:如果你的项目有Roslyn引用,并且你有兴趣不需要部署服务器,你将会在网站上得到不需要的错误,因为许多托pipe服务提供者还没有升级他们的服务器,因此不支持Roslyn。问题,您将需要从项目模板中删除Roslyn编译器。

按照下列步骤删除它

1.删除Nuget包,使用Nuget包控制台中的以下命令

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

2.完成后,应该自动更新web.config文件。 如果不是,请在web.config文件中查找以下代码,如果find,请删除这段代码。

 <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目录中(不在文件夹中)。 应用程序似乎工作,但。

一个干净的和重build为我工作!

所以Rob Cannon的回答基本上是为我工作的,但我不得不调整一些选项。 具体来说,我必须删除目标上的条件,以及更改Include属性,因为当我们的构build服务器上构build项目时,$ 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> 

根据上面Daniel Neel的评论:

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

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

这是Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.6 已知的问题 。 降级到1.0.5为我解决了这个问题。

在我的情况下,我只需要在Visual Studio解决scheme资源pipe理器(Web应用程序项目)中的bin目录并直接包含roslyn项目。 通过右键单击该文件夹并select包含在项目中。 再次检查解决scheme以触发构build过程。

roslyn文件夹默认不包含在内。

如果您正在添加ASPNETCOMPILER在MVC中编译您的Razor视图,就像在这个StackOverflow问题中一样 ,然后将PhysicalPath更改为放置在Roslyn nuget包所在的位置(通常通过$ CscToolPathvariables指向):

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

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

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

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

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

为了解决这个问题,在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

更新nuget包为我工作右键单击解决scheme>pipe理解决scheme的NuGet包,并更新所有包,特别是: Microsoft.Net.CompilersMicrosoft.CodeDom.Providers.DotNetCompilerPlatform

在我的情况下,类似于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

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

当我的应用程序安装在服务器上时,在本地主机上完全正常工作时,我遇到了同样的问题。

这些解决scheme都没有问题,我总是有同样的错误:

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

我结束了这样做:

  • 在我的设置项目上,右键点击查看>文件系统
  • 创build一个bin/roslyn文件夹
  • select添加>文件并添加packages\Microsoft.Net.Compilers.1.3.2\tools所有文件

这解决了我的问题。

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

  1. 右键单击解决scheme
  2. selectClean Solution
  3. 清理成功后,再次build立你的项目
  4. 再次运行该项目

    这次我不会看到同样的错误。 这按预期工作

清洁解决scheme构build运行

在我的情况下,它的工作。 祝你好运

删除解决scheme资源pipe理器中的Bin文件夹,然后重新生成解决scheme 这将解决这个问题

更新DotNetCompilerPlatform后,我遇到了同样的问题。 通过重新启动Visual Studio解决>清理项目>生成项目。

问题

请注意,NuGet PM打破了Rosalyn的行为。 单击Tools > NuGet Package Manager > Manage NuGet Packages for Solution如果更新存在Microsoft.CodeDom.Providers.DotNetCompilerPlatformMicrosoft.Net.CompilersMicrosoft.Net.Compilers.netcore ,更新它们,解决scheme将中断! 这是因为在创build项目时将ASP站点模板设置为使用特定版本。 要查看问题,请在解决scheme资源pipe理器中单击显示所有文件。

固定

在项目创build时, $(WebProjectOutputDir)\bin不存在,因此,当通过NuGet将Rosalyn添加为依赖项时,它将正确安装。 更新解决scheme包后, $(WebProjectOutputDir)\bin目录如下所示:

$(WebProjectOutputDir)\bin\bin\rosalyn

最简单的修复方法是将rosalyn剪切并粘贴到适当的位置,然后删除额外的bin文件夹。 您现在可以刷新页面,网站将加载。

我不得不改变WebAPI和MVC项目文件,以不build立意见:

 <MvcBuildViews>false</MvcBuildViews> 

这解决了与roslyn我的TFS 2015 Build服务器错误。 仍不知道为什么csc.exe被复制到\ bin \ csc.exe,但发布过程中正在寻找\ bin \ Roslyn \ csc.exe …找不到导致该差异的转换。

我在运行MSBuild的Jenkins构build服务器上遇到了这个错误,它将构build文件输出到一个单独的文件夹位置(_PublishedWebsites)。 完全一样 – roslyn文件夹不在bin目录中,所有的roslyn文件都与bin文件混合在一起。

@ igor-semin的答案是唯一对我有用的东西(因为我正在使用C#6语言function,我不能简单地按照其他答案卸载nuget软件包),但是由于我也在运行CodeAnalysis,我的部署目标服务器上有另一个错误

检测到Microsoft.CodeAnalysis.ICompilationUnitSyntaxtypes的Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntaxtypes的当前映射types为Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax的重写现有映射的尝试。

原因是当roslyn文件被转储到主bin目录中时,当你运行xcopy在嵌套的roslyn文件夹中重新创build它们时,你现在已经有了这些文件的两个副本被编译,并且它们之间有冲突。 经过多次挫折之后,我决定进行一个“黑客”修复 – 一个额外的后期构build任务,从bin目录中删除这些文件,消除冲突。

我的违规项目的.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> 

……………….更多在这里………………….

我遇到这个问题与发布pipe道(产生一个_PublishedWebsites目录),并将其用作项目中的目标:

 <Target Name="CopyRoslynCompilerFilesToPublishedWebsitesDirectory" AfterTargets="AfterBuild" Condition="Exists('$(OutDir)\_PublishedWebsites\$(TargetName)')"> <Copy SourceFiles="@(RoslyCompilerFiles)" DestinationFolder="$(OutDir)\_PublishedWebsites\$(TargetName)\bin\roslyn" ContinueOnError="true" SkipUnchangedFiles="true" /> </Target> 

缺点是在输出中会有两份Roslyn文件。

重命名解决scheme和一些包含项目后,我有这个错误,并玩弄删除nuget包。 我将新项目与上一个工作项目进行了比较,发现以下几行缺失,需要重新添加:

  <Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" /> <Import Project="..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> 

这样做为我解决了这个问题。

在通过NuGet更新一些软件包后,我遇到了这个问题。 重build(而不是一个正常的构build)已经为我工作。

FYI …

截至8/31/2017升级到Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.7是有效的。

为防止构build也将Roslyn文件复制到bin目录,您还必须注释掉放在Web应用程序项目顶部的这一行:

 <!-- <Import Project="..\..\..\DAS\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\..\..\DAS\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" /> -->