无法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=\"Web\" /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.Compilers和Microsoft.CodeDom.Providers.DotNetCompilerPlatform
在我的情况下,类似于Basim,有一个NuGet包告诉编译器我们需要C#6,而我们没有。
我们不得不删除NuGet包Microsoft.CodeDom.Providers.DotNetCompilerPlatform
然后删除:
- packages.config文件中的
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" />
-
<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=\"Web\" /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
所有文件
这解决了我的问题。
我在运行这个项目时也遇到同样的问题。 这是我遵循的步骤。
- 右键单击解决scheme
- selectClean Solution
- 清理成功后,再次build立你的项目
-
再次运行该项目
这次我不会看到同样的错误。 这按预期工作
清洁解决scheme构build运行
在我的情况下,它的工作。 祝你好运
删除解决scheme资源pipe理器中的Bin文件夹,然后重新生成解决scheme 这将解决这个问题
更新DotNetCompilerPlatform后,我遇到了同样的问题。 通过重新启动Visual Studio解决>清理项目>生成项目。
问题
请注意,NuGet PM打破了Rosalyn的行为。 单击Tools > NuGet Package Manager > Manage NuGet Packages for Solution
如果更新存在Microsoft.CodeDom.Providers.DotNetCompilerPlatform
, Microsoft.Net.Compilers
或Microsoft.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')" /> -->