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

我正在尝试运行从TFS(Team Foundation Server)源代码控制中检索的ASP.NETMVC(模型-视图-控制器)项目。我已经添加了所有程序集引用,并且我能够成功构建和编译而没有任何错误或警告。

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

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

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

在此处输入图片描述

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

699730 次浏览

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

这里有一个更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目录中(而不是文件夹中)。不过,该应用程序似乎可以工作。

在我的情况下,我只需要转到Visual Studio解决方案资源管理器(Web应用程序项目)中的bin目录并直接包含roslyn项目。通过右键单击文件夹并选择包含在项目中。然后再次签入解决方案以触发构建过程。

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

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

TL; DR

在包管理器控制台中运行:

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

更多信息

此问题与Visual Studio本身无关,因此建议添加构建步骤以复制文件的答案是一种解决方法。手动向项目添加编译器二进制文件相同。

Roslyn编译器来自NuGet包,并且该包的某些版本中存在/曾经存在bug(我不知道确切的是哪些版本)。解决方案是将该包重新安装/升级到bug版本。最初,在我在2015年编写答案之前,我通过在特定版本上安装以下包来修复它:

  • 编译器1.1.1
  • Microsoft. CodeDom. Providers. DotNetCompilerPlatform 1.0.1

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

所以,Rob Cannon的回答基本上对我有用,但我不得不调整一些选项。具体来说,我必须删除目标上的条件,并更改包括属性,因为在我们的构建服务器上构建项目时$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>

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

我们必须删除NuGet包Microsoft.CodeDom.Providers.DotNetCompilerPlatform,然后删除:

  1. 从packages.config文件
  2. <编译器><编译器语言="c#; cs; cSharp"扩展名="cs"type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft. CodeDom. Providers. DotNetCompilerPlatform, Version=1.0.0.0,区域性=中性, PublicKeyToken=31bf3856ad364e35"warningLevel="4"compilerOptions="/langversion: 6 /nowarn: 1659; 1699"/><编译器语言="vb; vbs; Visual Basic; vbScript"扩展=". vb"类型="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft. CodeDom. Providers. DotNetCompilerPlatform,版本=1.0.0.0,区域性=中性, PublicKeyToken=31bf3856ad364e35"warningLevel="4"compilerOptions="/langversion: 14 /nowarn: 41008 /define:_MYTYPE=\"Web\" /optionInfer+"/>

system.codedom节点中,您可以看到它引入roslyn的原因:compilerOptions="/langversion:6

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

如果您要添加ASPNETCOMPILER以在MVC中编译Razor视图,例如在这个StackOverflow问题中,然后将物理路径更改为Roslyn nuget包所在的位置(通常通过$cscToolPath商品列表变量指向):

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

打开项目文件并删除所有引用,其中导入项目="…\包\Microsoft. CodeDom. Providers. DotNetCompilerPlatform.1.0.0……

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

将属性组添加到您的. 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>

问题

请注意,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

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

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

Microsoft.CodeDom.Providers.DotNetCompilerPlatformMicrosoft.Net.Compilers

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

我们为什么要删除Roslyn:如果您的项目有Roslyn参考并且您有兴趣部署它在服务器上,你会得到不必要的错误在网站上尽可能多托管服务提供商仍然没有升级他们的服务器,因此不支持Roslyn。要解决此问题,您需要删除项目模板中的Roslyn编译器。

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

<强>1。删除NuGet包,使用Nuget包控制台中的以下命令

PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatformPM> 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>

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

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

<MvcBuildViews>false</MvcBuildViews>

这解决了我使用roslyn的TFS 2015构建服务器错误。仍然不确定为什么csc.exe被复制到\bin\csc.exe,但发布过程正在查找\bin\Roslyn\csc.exe.…找不到导致该差异的转换。

更新nuget包对我有用右键单击解决方案>为解决方案管理NuGet包并更新所有软件包,特别是:Microsoft. Net. Comp的编译器Microsoft。Code Dom。提供商。Dot Net编译器平台

删除解决方案资源管理器中的bin文件夹并再次构建解决方案。这将解决问题

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

@igor-semin的回答是唯一对我有用的东西(因为我使用的是C#6语言功能,我不能像其他答案那样简单地卸载nuget包),但当我还在运行CodeAnalysis时,我在部署目标服务器上遇到了另一个错误:

检测到尝试重写现有映射的行为,其类型Microsoft.CodeAnalysis.IComPilationUnitSyn这话的名称为"",当前映射到类型Microsoft.CodeAnalysis.CSharp. Syntus. CompilationUnitSyntus,类型为Microsoft. CodeAnalysis. VisualBasic. Syntus. CompilationUnitSyntus。

这样做的原因是,由于roslyn文件被转储到主bin目录中,当您运行xcop以在嵌套的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>

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

一个干净和重建工作给我!

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

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

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

我最终这样做了:

  • 在我的安装项目中,右循环,视图>文件系统
  • 创建bin/roslyn文件夹
  • 选择add>files并添加packages\Microsoft.Net.Compilers.1.3.2\tools中的所有文件

这解决了我的问题。

我在发布管道(生成_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文件副本。

我在重命名解决方案和一些包含的项目以及尝试删除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')" />

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

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

  1. 右键单击解决方案
  2. 选择清洁解决方案
  3. 干净成功后,再次构建您的项目
  4. 再次运行该项目

这次我没有看到同样的错误。这和预期的一样。

以上是Daniel Neel的评论:

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

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

这是一个带有Microsoft。Code Dom。提供商。Dot Net编译器平台 1.0.6的已知问题。降级到1.0.5为我修复了这个问题。

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

我在更新DotNetCompilerPlatform后遇到了同样的问题。通过重新启动Visual Studio>Clean Project>Build Project来解决。

仅供参考…

截至2017年8月31日,升级到Microsoft. CodeDom. Providers. DotNetCompilerPlatform 1.0.7是有效的。

这可以通过以下简单的方法来完成:

  • 在系统的任何地方创建一个类似类型的新项目。构建它并将roslyn文件夹复制到您的bin目录。

我的解决方案是使用Nuget将以下项目更新到最新版本:-Microsoft. Net.编译器-Microsoft. CodeDom. Providers. DotNetCompilerPlatform然后重建了项目。由于我的项目是一个网站,所以没有*. csproj文件。当我尝试在浏览器中查看cshtml时出现上述错误。

上面两项更新到最新版本后修复的错误。我在VS2015和Windows 7 SP1中

在我的情况下,我有问题在Jenkins当它试图部署它在八达通以下错误:

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#:抛出无效的表达式编译)并以这种方式解决(如何在Visual Studio 2015中使用C#7?)。这导致,当我在主程序上安装组件时,Microsoft.Net.Compilers会自动添加。

解决方案

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

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

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

最后,在我的主程序中,我试图更新我的内部组件。一切都比重新构建。它已经构建了没有任何问题或问题。

我在Microsoft.CodeDom.Providers.DotNetCompilerPlatform1.06中遇到了这个错误,但在@PrisonerZERO工作的1.0.7中也出现了这个错误。然而,当Microsoft发布1.0.8 2017-10-18时,它终于开始为我工作,我不必降级。

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/

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

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

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

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

更改目标。NET框架,重新安装软件包(Update-Package -reinstall)然后构建项目对我有用。您甚至可以在此操作后将目标框架更改回来(确保之后再次重新安装nuget包)。

NuGet包管理器

您需要安装Microsoft. CodeDom. Providers. DotNetCompilerPlatform. BinFix,是专门为这个错误创建的

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

Microsoft。Code Dom。提供商。Dot Net编译器平台

我的是从1.0.0到2.0.0参考(错误不再显示)

我遵循这些步骤,它工作得很好

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

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

在我的情况下,当我同时运行两个Visual Studio IDE时遇到了这个问题。所以解决方案是清理项目并关闭另一个实例。

  • 右键单击您的项目并选择管理Nuget包
  • 查找“Microsoft. CodeDom. Providers. DotNetCompilerPlatform”
  • 只需更新到旧版本或更新版本(无论哪个),然后再次更新回原始版本。

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

不推荐

对于网站项目和Web应用程序项目,答案是不同的。潜在的问题是相同的NuGet包在不同机器上的行为不同。可能是权限问题或某些执行策略阻止它复制到bin文件夹如您所知,Roslyn是新的编译器。你应该有它在bin文件夹为这些项目转到您的网站NuGet包检查此文件夹Microsoft。Code Dom。提供商。Dot Net编译器平台。2.0.0\code\包\Microsoft。Code Dom。提供商。Dot Net编译器平台。2.0.0你看见了吗?你能看到代码\包\Microsoft. CodeDom. Providers. DotNetCompilerPlatform.2.0.0\工具\RoslynLatest在里面吗现在,作为编译此文件夹的一部分,应该像这样复制到您的网站bin下。\code\WebSite1\bin\Roslyn有些事情不会发生在你身上。尝试以管理员身份运行Visual Studio。手动复制Roslyn文件夹。尝试卸载并安装NuGet包。记住这个包编译你的文件夹,如果它不在那里,你就不能编译任何东西,所以你也不能添加任何东西。尝试将此包复制到离线版本工具->选项->nuget包管理器->包源->Microsoft Visual Studio离线包C:\Program Files(x86)\Microsoft SDK\NuGetPackages

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

其中很多答案都指Nuget包和/或清理和重新加载您的项目。

如果您有WCF服务引用和无效的端点,您也会收到此错误消息。请确保您的端点正确,并在. config中使用正确的端点更新服务配置,以及从GUI配置服务引用时。

服务引用配置GUI映像

GitHub上Roslyn项目中的一个问题所述,解决方案(对我有效)是在Visual Studio中简单地卸载并重新加载项目。

“bin\roslyn”文件夹在构建或重建时没有创建,直到我重新加载项目。

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

重新启动Windows。

这是在尝试重建、删除bin的内容并重建、重新启动Visual Studio后对我有效的唯一解决方案。

这是C#/. NET构建工具有多糟糕的另一个例子。

我认为(在阅读了许多答案之后),总体结论是这个问题的原因和解决方案在很大程度上取决于设置和项目,所以如果一个答案不起作用,就尝试另一个。尝试非侵入性/破坏性的解决方案,例如重新启动Visual Studio、重新启动、重建等,首先,在搞乱NuGet包或重新安装开发工具之前。祝你好运!

(注意:使用Visual Studio 2019,项目文件最初是在Visual Studio 2015中创建的。也许这有助于有人调查问题)

(编辑:这可能是由于安装/修改Visual Studio安装或在安装程序提示重新启动时更新Visual Studio后未重新启动造成的吗?)

在我的情况下,我们的团队不想保留“包”文件夹,所以我们将所有dll放在其他目录中,例如“Sharedlib”。

我使用构建事件来解决这个问题。

if "$(ConfigurationName)" == "Release" (goto :release) else (goto:exit)
:releaseif not exist $(TargetDir)\roslyn mkdir $(TargetDir)\roslyn
copy /Y "$(ProjectDir)..\..\Shared Lib\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\tools\Roslyn45\*" "$(TargetDir)\roslyn"goto :exit
:exit

我在部署到的服务器上遇到了这个问题,并确定我不需要

Microsoft。Code Dom。提供商。Dot Net编译器平台

所以,我通过nuget卸载了它,并删除了Web配置中的引用。没有更多的问题。

我最初试图将目标节点添加到. proj文件中,如其他一些答案所述,但这只会导致另一个错误,其中msbuild无法复制pagefile.sys,这似乎是我在nuget包中读到的bug。

0.快速修复

正如在目前票数最高的答案中已经指出的,快速修复是使用包管理器,工具>Nuget PackageManager>包管理器控制台,运行

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

数据包管理器控制台-如何打开

1.重现错误的代码

以下是重现错误的代码:
https://user.it.uu.se/%7Ehesc0353/SrvrErr-reproduce.zip
(最初来自https://github.com/aspnet/AspNetDocs/tree/master/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client/sample/server/ProductsApp

考虑尝试上面zip文件中提供的示例代码。
如果没有改变,Ctrl+F5将被复制错误。

应用程序中的服务器错误

2.更稳健的解决方案

另一种解决方案是从项目中删除一个属性Web.config文件。
Web.config.csproj文件位于同一目录中。)
这将自动并静默地重新创建您的包,如果它们不见了

在文本编辑器或Visual Studio中打开Web.config文件。

<?xml version="1.0" encoding="utf-8"?><configuration><appSettings></appSettings>...<system.codedom><compilers><compiler language="c#;cs;csharp" extension=".cs"type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"warningLevel="4" compilerOptions="/langversion:default /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.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/></compilers></system.codedom></configuration>

在标签配置>system.codedom>编译器>编译器语言="c#; cs; cSharp",完全删除type属性。-简而言之,删除以type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, 1

Visual Studio将负责其余的工作。#Server Error in '/' Application

3. HTTP错误403

在上面提供的示例中,点击Ctrl+F5现在将导致HTTP错误403

HTTP错误403.14-禁止

尝试将Web浏览器中的http://localhost:64195替换为http://localhost:64195/api/productsWeb API现在正确显示:

包含产品的Web API


作为一个挑衅,我试图删除整个package目录Visual Studio项目。
一旦项目完成,它就会自动且静默地重新创建重建

参考文献


1大概,相同的修复也适用于Visual Basic至于C#,但我没有试过。

其他答案都不适合我。在对我预期的提交文件之前/之后进行文件夹比较后,我发现GIT忽略了一个必需的文件夹。如果您在存储库中跟踪编译器,请确保跟踪BUILD文件夹。如果不是,编译器将永远不会构建,并在发布后抛出这个确切的错误。我将这行添加到我的. gitignore文件中:

!**/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1/build/

现在它正在正确地部署到其他计算机上。

对于VS 2019,完全删除以下节点:

<system.codedom></system.codedom>

以下内容为我解决了这个问题:

  • 更新到最新版本的Visual Studio 2017(使用安装程序应用程序)

  • 清洁并重建溶液

太迟了一个答案,但仍然张贴incase它帮助任何人。
按照以下步骤为我修复了错误:

  1. 删除包裹文件夹
  2. 开放VS
  3. 重建
  4. 注意NuGet包被还原,但bin\roslyn没有创建
  5. 卸载项目
  6. 重新加载项目
  7. 重建
  8. 注意bin\roslyn现在已经创建。

在我的情况下,在尝试任何其他解决方案之前,我切换到“发布”配置,重建(创建文件夹),然后切换回“调试”,而文件夹保持不变。

这是旧解决方案的源代码控制的签出,显然原始(自动)包还原和构建项目并没有在bin目录中创建该文件夹。

请注意,在撰写本文时,受指责的组件已达到v.2。

我尝试了多个顶级答案,直到以下步骤有效(ASP.NET项目定位. NET Framework 4.6.2,Visual Studio 2019在具有疯狂限制性组策略的系统上,2021年3月)。

我需要:

  • 将VS作为管理员运行

  • 在包管理器控制台中运行

    Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -v 2.0.1
  • 清洁和重建解决方案

如果不以管理员身份运行VS,组策略会阻止Update-Package需要运行的ps1脚本。

PS。在这起作用之前,我尝试了许多其他答案(并在失败后运行git重置-很难)。我不知道他们中是否有人最终对此做出了贡献。我尝试了:

安装nudget包:Microsoft. CodeDom. Providers. DotNetCompilerPlatform. BinFixhttps://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix/1.0.0

对于那些在构建服务器(TFS或Bambu)上编译时遇到此问题的人,我能够通过从“/t:”msbuild选项中删除“干净”选项来解决此问题。

我也面临着同样的问题,通过在nuget控制台中运行下面的命令得到了解决

安装包Microsoft. Net. Compers-版本3.3.1

在我的情况下,我注意到“build”文件夹不存在于“包\Microsoft. CodeDom. Providers. DotNetCompilerPlatform.2.0.0”路径中。这就是没有创建roslyn文件夹的原因。

所以我的解决方案是:

  1. 清洁解决方案
  2. 转到Nuget包管理器
  3. 卸载Microsoft. CodeDom. Providers. DotNetCompilerPlatform
  4. 清洁解决方案
  5. 从Nuget包管理器再次安装Microsoft. CodeDom. Providers. DotNetCompilerPlatform。
  6. 清洁/重建

就这样。上面的解决方案都不适合我。希望这对任何人都有帮助