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

xnobis 发布于 2019-07-26 asp.net 最后更新 2019-07-26 11:18 277 浏览

我试图运行从TFS源代码管理检索到的Asp.net MVC项目。我添加了所有程序集引用,并且能够成功构建和编译,而不会出现任何错误或警告。 但在浏览器中出现以下错误:

Could not find a part of the path 'C:\B8akWorkspace\B8akProject\B8akSolution\B8AK.Portal\bin\roslyn\csc.exe'.
以下是错误页面的完整截图。 enter image description here 经过几天的研究,我了解Roslyn是.Net编译器平台,它提供了高级编译功能。但是,我不明白为什么我的版本试图找到\ bin \ roslyn \ csc.exe,因为我没有配置任何与Roslyn相关的任何内容,也不打算在我的项目中使用Roslyn。
已邀请:

jiusto

赞同来自:

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

jquia

赞同来自:

我不得不将WebAPI和MVC项目文件更改为不构建视图:

<MvcBuildViews>false</MvcBuildViews>
这解决了我使用roslyn的TFS 2015 Build服务器错误。仍然不确定为什么csc.exe被复制到\ bin \ csc.exe,但是发布过程正在寻找\ bin \ Roslyn \ csc.exe ...找不到导致这种差异的转换。

xesse

赞同来自:

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

修复 在项目创建时,$(WebProjectOutputDir)\bin不存在,因此当NuGet将Rosalyn添加为依赖项时,它会正确安装它。更新解决方案包后,$(WebProjectOutputDir)\bin目录如下所示: $(WebProjectOutputDir)\bin\bin\rosalyn 最简单的解决方法是Cut&将rosalyn粘贴到正确的位置,然后删除额外的bin文件夹。您现在可以刷新页面并加载站点。

cvitae

赞同来自:

默认VS2015模板的问题是编译器实际上并未复制到{outdir}_PublishedWebsites\tfr\bin\roslyn\目录,而是复制到{outdir}\roslyn\目录。这可能与您的本地环境不同,因为AppHarbor使用输出目录构建应用程序,而不是“就地”构建解决方案。 要解决此问题,请在xml块<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">...</Target>之后立即将以下内容添加到.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>
参考:https://support.appharbor.com/discussions/problems/78633-cant-build-aspnet-mvc-project-generated-from-vstudio-2015-enterprise

ynulla

赞同来自:

重命名解决方案和一些包含项目后,我遇到了这个错误,并且正在使用删除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')" />
这样做解决了我的问题。

mid

赞同来自:

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

iid

赞同来自:

打开项目文件并使用Import Project =“.. \ packages \ Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0 ....删除所有引用。 打开web.config并删除所有system.codedom编译器属性

met

赞同来自:

根据Daniel Neel的评论: 版本1.0.3的Microsoft.CodeDom.Providers.DotNetCompilerPlatform Nuget包适用于我,但版本1.0.6导致此问题中的错误 降级到1.0.3为我解决了这个问题。

pporro

赞同来自:

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

eut

赞同来自:

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

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

jeum

赞同来自:

我在运行MSBuild的Jenkins构建服务器上遇到此错误,该服务器将构建文件输出到单独的文件夹位置(_PublishedWebsites)。完全相同 - roslyn文件夹不在bin目录中,并且所有roslyn文件都与bin文件混在一起。 @igor-semin 's answer是唯一对我有用的东西(因为我正在使用C#6语言功能,我不能简单地按照其他答案卸载nuget软件包),但是当我还运行CodeAnalysis时,我的部署目标上又出现了另一个错误服务器: 检测到名为“”的Microsoft.CodeAnalysis.ICompilationUnitSyntax类型覆盖现有映射的尝试,当前映射到类型Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax,以键入Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntax。 原因是当roslyn文件被转储到主bin目录中时,当你运行xcopy在嵌套的roslyn文件夹中重新创建它们时,你现在有2个这些文件的副本被编译,它们之间存在冲突。经过多次挫折之后,我决定进行“黑客”修复 - 一个额外的构建后任务,从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>
...................更多这里......................

sut

赞同来自:

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

dsit

赞同来自:

在我的例子中,类似于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节点中,您可以看到它为什么引入了roslyn:compilerOptions="/langversion:6

aut_ut

赞同来自:

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

oad

赞同来自:

当在localhost上完美运行时,我在服务器上安装应用程序时遇到了同样的问题。 这些解决方案都没有,我总是有同样的错误:

Could not find a part of the path 'C:\inetpub\wwwroot\myApp\bin\roslyn\csc.exe'
我最终这样做了:
  • 在我的安装项目上,右侧是clic,view>文件系统
  • 创建一个bin/roslyn文件夹
  • 选择添加>文件并添加packages\Microsoft.Net.Compilers.1.3.2\tools
  • 中的所有文件
这解决了我的问题。

iipsa

赞同来自:

为了防止构建还将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')" /> -->

wsed

赞同来自:

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

nnihil

赞同来自:

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

nsit

赞同来自:

清洁和重建对我有用!

gut

赞同来自:

这是COACE_0的PLACEHOLDER与PLACEHOLDER FOR_CODE_1 1.0.6。降级到1.0.5为我解决了这个问题。

psequi

赞同来自:

清洁解决方案 建立 跑 在我的情况下,它工作。祝你好运

pnon

赞同来自:

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

oillo

赞同来自:

我使用发布管道(生成_PublishedWebsites目录)遇到了这个问题,并将其用作项目中的Target:

<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文件副本。

gut

赞同来自:

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

xet

赞同来自:

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

jneque

赞同来自:

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

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

wet

赞同来自:

这可以通过以下简单方式完成:

  • 在系统中的任何位置创建类似类型的新项目。构建它并将roslyn文件夹复制到bin目录。

in_id

赞同来自:

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

Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Microsoft.Net.Compilers
What is Roslyn and Who added them(packages) in project : If you’re using .net Framework 4.5.2 to create projects using VS2015, you might have noticed that the project templates use Roslyn by default. Actually Roslyn is one of open-source compilers for .NET languages from Microsoft. Why should we delete Roslyn : If your project has Roslyn references and you are interested to deploy it no server, you will get unwanted errors on the website as many hosting providers still have not upgraded their servers and hence do not support Roslyn.To resolve this issue, you will need to remove the Roslyn compiler from the project template.
按照下面的步骤删除它 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>

nqui

赞同来自:

在我的情况下,解决方案是重新安装/升级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控制台中运行: PM > update-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r

nsit

赞同来自:

所以,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>