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

Could not find a part of the path ... bin\roslyn\csc.exe

提问人:Eyad 提问时间:9/25/2015 最后编辑:HenkeEyad 更新时间:8/6/2023 访问量:779773

问:

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

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

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

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

enter image description here

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

C# asp.net .NET Visual-Studio Roslyn

评论


答:

591赞 Mitchell 9/25/2015 #1

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

评论

13赞 Eyad 9/25/2015
这不能解决我的问题。现在我得到“找不到文件”C:\B8akWorkspace\B8akProject\B8akSolution\B8AK。门户\bin\roslyn\csc.exe'。请注意,当我在 VS2015 中创建一个新的 MVC 项目时,我在 .csproj 中没有看到提到的配置,它在浏览器中运行良好
4赞 Eyad 9/25/2015
谢谢。现在,在下载 Roslyn 目录并将其放在 /bin 文件夹中后,我可以在浏览器中生成并运行项目。我没有放置上面提到的 PstBuildEvent,它仍然有效。也许您想在上面编辑您的答案,并提到需要手动放置 Roslyn 文件并更好地反映解决方案。
19赞 Ian Robertson 2/14/2018
我发现将Microsoft.CodeDom.Providers.DotNetCompilerPlatform更新到1.0.8和Microsoft.Net.Compilers 2.6.1对我帮助很大。我不需要添加这个额外的目标。看起来在更高版本的工具中添加了类似的东西:github.com/aspnet/RoslynCodeDomProvider/commit/...
6赞 juanytuweb 11/16/2018
我已将 Microsoft.Net.Compilers 的版本从 Nuget 更新到 2.10.0 版,它一直是我的解决方案。我正在使用 targetFramework=“4.6.2”
6赞 Kappacake 9/19/2019
不要仅仅因为 VisualStudio 不正常而向解决方案添加代码!看看下面的其他答案。
64赞 Rob Cannon 10/8/2015 #2

下面是一种更 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 目录中(不在文件夹中)。不过,该应用程序似乎可以工作。

评论

4赞 Rob Cannon 7/19/2016
可以将其放在 .csproj 文件中的任意位置,与另一个 <Target> 标记处于同一级别。我通常把它放在底部。
9赞 Martijn van Halen 11/7/2015 #3

就我而言,我只需要转到 Visual Studio 解决方案资源管理器(Web 应用程序项目)中的 bin 目录并直接包含 roslyn 项目。右键单击文件夹并选择“包含在项目中”。并再次签入解决方案以触发生成过程。

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

1赞 Basim 12/18/2015 #4

若要防止生成也将 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')" /> -->
1930赞 andy250 12/21/2015 #5

TL;博士

在包管理器控制台中运行以下命令:

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

更多信息

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

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

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

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

评论

0赞 wooters 3/10/2022
出于某种原因,如果有人在运行上述命令后仍然遇到错误,我必须进入 Nuget 包管理器并手动选择最新版本 (3.6.0) 才能正常工作。
11赞 jonnybot 1/16/2016 #6

所以,Rob Cannon 的回答基本上对我有用,但我不得不调整一些选项。具体来说,我必须删除目标上的条件,并更改 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>

评论

1赞 Julien D. 9/7/2016
这种行为甚至更糟。在本地,如果转到文件夹并删除两个文件夹 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.n.n 并生成代码,则$CscToolPath将为空。如果第二次构建,则它不会为空。该问题始终发生在生成服务器上,因为它始终被视为“首次生成”。您的代码可以完美运行,但如果更新 Microsoft.Net.Compilers 包,则必须更新 .csproj。谢谢。
3赞 JanDotNet 1/4/2017
请注意,如果 Microsoft.Net.Compilers 的版本发生更改,此解决方案将失败(或必须调整)。
0赞 iowatiger08 1/27/2018
我升级了 Microsoft.CodeDom.Providers.DotNetCompilerPlatform,然后能够继续。
7赞 Mark C. 2/18/2016 #7

就我而言,与 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>

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

评论

1赞 BlueSky 4/4/2016
我所要做的就是卸载NuGet包“Microsoft.CodeDom.Providers.DotNetCompilerPlatform”,这为我解决了它(我的项目面向.NET 4.5.2)。
1赞 Always Learning 4/28/2016
这对我有用。您还需要删除 Microsoft.Net.Compilers,因为没有理由保留这种额外的依赖关系。
7赞 Korayem 4/4/2016 #8

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

评论

1赞 Max 7/18/2018
/d 选项仅复制较新的文件(代表“日期”)。请记住,部署到云/Azure 中,时间可能落后于/早于当地时间。
8赞 Anrijs Vītoliņš 5/3/2016 #9

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

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

7赞 user6326076 5/12/2016 #10

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

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

2赞 Igor Semin 5/13/2016 #11

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

评论

0赞 Max 7/18/2018
对我不起作用,所有变量都是未定义的(空)
-1赞 eyoung100 7/29/2016 #12

问题

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

修复

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

$(WebProjectOutputDir)\bin\bin\rosalyn

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

208赞 Malik Khalil 7/30/2016 #13

注意:如果您对使用 Roslyn 不感兴趣,请按照此答案操作并将其删除

罗斯林:

您的生成正在尝试查找,因为以下包已添加到您的项目中。只需查看您的文件,您就可以将它们都放在那里\bin\roslyn\csc.exepackages.config

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

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

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

如何删除它:

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

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>

评论

39赞 Matti Virkkunen 4/11/2017
如果您真的使用新的编译器和新功能,这并不是一个真正的解决方案。
22赞 cchamberlain 4/12/2017
你是在倡导反对未来。
2赞 Alisson Reinaldo Silva 12/26/2017
@cchamberlain为什么是未来?我只是认为它应该是谨慎的,但看起来很多人都遇到了麻烦。
2赞 cchamberlain 1/3/2018
@Alisson - Roslyn 是事情的发展方向。它包含更新的语言功能,性能更高,跨平台和开源。它是在其他工具之后出现的——因此是未来。没有什么说你需要使用它,大多数升级都会产生一些费用。请参阅“为什么在 ASP.NET 中进行 Roslyn 编译?”部分:blogs.msdn.microsoft.com/webdev/2014/05/12/...
2赞 Jeson Martajaya 12/13/2019
如果您想将 MVC 项目发布到 GoDaddy 共享 Windows 主机,这就是答案。GoDaddy不会像csc.exe那样运行可执行文件
9赞 Ben 8/14/2016 #14

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

0赞 Robert J. Good 10/22/2016 #15

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

<MvcBuildViews>false</MvcBuildViews>

这解决了我的 TFS 2015 生成服务器错误与 roslyn。仍然不确定为什么将 csc.exe 复制到 \bin\csc.exe,但发布过程正在寻找 \bin\Roslyn\csc.exe...找不到导致这种差异的转换。

13赞 hichamkazan 11/30/2016 #16

更新 nuget 包对我有用 右键单击解决方案>“管理解决方案的 NuGet 包” 并更新所有软件包,特别是:Microsoft.Net.CompilersMicrosoft.CodeDom.Providers.DotNetCompilerPlatform

6赞 user1903050 12/16/2016 #17

删除解决方案资源管理器中的“Bin”文件夹,然后再次生成解决方案。这将解决问题

0赞 Ciaran 12/21/2016 #18

我在运行 MSBuild 的 Jenkins 生成服务器上遇到了此错误,该服务器将生成文件输出到单独的文件夹位置 (_PublishedWebsites)。完全相同 - roslyn 文件夹不在 bin 目录中,并且所有 roslyn 文件都与 bin 文件混为一谈。

@igor-semin 的答案是唯一对我有用的东西(因为我使用的是 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>

...................更多内容请......................

278赞 pipedreambomb 1/5/2017 #19

清洁和重建对我有用!

评论

4赞 leemicw 3/28/2017
我不认为清洁是必需的。根据对该问题的讨论,重建而不是常规构建将始终将 roslyn 文件放回原处。github.com/dotnet/roslyn/issues/15556
0赞 m.edmondson 11/17/2017
重建为我解决了,我在输出中注意到了这一点Copying file from "C:\Users\medmondson\Source\UK\Portal\Branches\v12\Source\packages\Microsoft.Net.Compilers.1.3.2\tools\csi.exe" to "bin\Debug\roslyn\csi.exe".
6赞 Johann 12/15/2018
DotNetCompilerPlatform 1.0.3,Microsoft.Net.Compilers 1.3.2,VS Pro 2017 15.9.4在这里。即使在重新启动 Visual Studio 之前和之后,清理/重建也对我不起作用。最后,构建>批量构建...> Rebuild All 成功了。它一定是低声说了正确的甜言蜜语,没有让 VS 看到它在输出中缺少 bin/roslyn 目录。
7赞 Lews Therin 4/16/2019
Clean and Rebuild 为我解决了问题。对于那些说只做重建会起作用的人......重建的行为是可以修改的,并不总是只进行清理和构建。请参阅此答案的#2。
0赞 AGuyCalledGerald 7/19/2019
@pipedreambomb,你是对的,但你不会想一直清理/重建。
7赞 Alexandre Hamon 2/13/2017 #20

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

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

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

我最终这样做了:

  • 在我的安装项目中,右键单击 CLIC,查看>文件系统
  • 创建文件夹bin/roslyn
  • 选择“添加>文件”,然后从以下位置添加所有文件packages\Microsoft.Net.Compilers.1.3.2\tools

这解决了我的问题。

0赞 EKW 6/22/2017 #21

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

0赞 TTT 7/31/2017 #22

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

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

33赞 Narendra 8/4/2017 #23

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

  1. 在解决方案中单击鼠标右键
  2. 选择“清洁解决方案”
  3. 清理成功后,再次构建你的项目
  4. 再次运行项目

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

10赞 Jason Coyne 8/9/2017 #24

根据上面丹尼尔·尼尔(Daniel Neel)的评论:

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

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

评论

4赞 akatakritos 8/14/2017
1.0.6 有一个错误:github.com/aspnet/RoslynCodeDomProvider/issues/13
3赞 altso 8/19/2017
1.0.7 在某些场景下仍会受到影响 github.com/aspnet/RoslynCodeDomProvider/issues/17
12赞 jrummell 8/11/2017 #25

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

1赞 Helen 8/14/2017 #26

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

1赞 Uhha 8/24/2017 #27

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

1赞 Prisoner ZERO 9/1/2017 #28

仅供参考...

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

1赞 Sriman Saswat Suvankar 11/27/2017 #29

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

  • 在系统中的任意位置创建类似类型的新项目。生成它并将 roslyn 文件夹复制到 bin 目录。
3赞 Penny 1/28/2018 #30

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

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

11赞 Maytham Fahmi 2/2/2018 #31

就我而言,当 Jenkins 尝试将其部署在 Octopus 中时,我在 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

原因

花了一段时间后,我正在使用一个内部开发的组件,该组件正在使用 .内部组件使用的原因是克服这个问题(C#:抛出无效的表达式编译),并以这种方式解决(如何在 Visual Studio 2015 中使用 C# 7?这导致,当我在主程序上安装组件时,它会自动添加。Microsoft.Net.CompilersMicrosoft.Net.CompilersMicrosoft.Net.Compilers

溶液

我的解决方法是,通过以下方式从我们的内部组件卸载(遵循@malikKhalil答案)

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

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

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

2赞 Ogglas 2/14/2018 #32

我遇到了这个错误,但也对@PrisonerZERO有用。但是,当Microsoft发布2017-10-18时,它终于再次开始为我工作,我不必降级。Microsoft.CodeDom.Providers.DotNetCompilerPlatform1.061.0.71.0.8

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

4赞 Erik Silva 3/14/2018 #33

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

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

当尝试将已经完成的项目带入在 git 上创建的空白解决方案时,对我有用。

5赞 Miroslav Adamec 3/15/2018 #34

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

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

评论

0赞 GarDavis 1/28/2019
这是一个“网站项目”。我使用这个命令只是重新安装一个包:update-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -reinstall
19赞 Adrian Berca 3/19/2018 #35

NuGet Package Manager

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

评论

0赞 Drew Miller 3/23/2018
这不起作用 - 我怀疑该包实际上并非用于此确切目的。
0赞 Juan Acosta 2/28/2019
我用 VS 2017 进行了测试,它工作正常,这可能是其他版本的问题。
18赞 Mateusz 4/13/2019
我没有安装来自昵称为“dsx”的随机人的随机软件包。那是很大的安全,不...
1赞 Eliasar 8/28/2019
@Mateusz或一个可以修复我的 non-APS.NET [原文如此] 文件夹结构的人
24赞 josh.thomson 7/12/2018 #36

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

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

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

评论

1赞 LosManos 3/25/2019
我也这样做了。现在,该文件夹已在我的输出路径中创建。我在我的 csproj 中也没有看到“roslyn”引用。这可能是 VS2015 的东西,在我拥有的 2017 年(版本)中不是必需的。值得注意的是:由于我在尝试添加复制目标(我提到的那个)之前更新了 DotnetCompilerPlatform,因此我有一个更干净的 csproj。roslynTarget Name="CopyRoslyn...
34赞 Masoud Darvishian 1/24/2019 #37

我遵循了这些步骤,它运行良好

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

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

4赞 Badr Bellaj 2/13/2019 #38

就我而言,当我同时运行两个Visual Studio IDE时,我遇到了这个问题。因此,解决方案是清理项目并关闭另一个实例。

19赞 Bojan 2/26/2019 #39
  • 右键单击项目,然后选择“管理 Nuget 包”
  • 查找“Microsoft.CodeDom.Providers.DotNetCompilerPlatform”
  • 只需更新到较旧或较新的版本(无论哪个版本),然后再次更新回原始版本即可。

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

Nuget - DotNetCompilerPlatform

评论

0赞 Sam Salim 5/10/2023
谢谢,降级到 3.11.0.0 对我有用。我认为最新的新版本 4.1.0 有问题
-1赞 Jin Thakur 3/1/2019 #40

对于网站项目和 Web 应用程序项目,答案是不同的。 根本问题与 NuGet 包在不同计算机上的行为不同。可能是权限问题或某些执行策略阻止它复制到 Bin 文件夹 如您所知,Roslyn 是新的编译器。 您应该将其放在这些项目的 Bin 文件夹中 转到您的网站 NuGet 包检查此文件夹 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0 \code\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0 你看到了吗? 您能看到 code\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\tools\RoslynLatest 吗? 现在,作为编译的一部分,此文件夹应该像这样复制到您的网站的bin下。 \code\WebSite1\Bin\Roslyn 不知何故,这对你来说没有发生。 尝试以管理员身份运行 Visual Studio。 手动复制 Roslyn 文件夹。 尝试卸载并安装 NuGet 包。 请记住,这个包编译你的文件夹,如果它不存在,你就不能编译任何东西,所以你也不能添加任何东西。 尝试将此包复制到脱机版本 tools -> options-> nuget 包管理器->包源> Microsoft Visual Studio 脱机包 C:\Program Files (x86)\Microsoft SDKs\NuGetPackages

26赞 nischa 4/3/2019 #41
  1. 清洁解决方案
  2. 重建解决方案 ,这两个步骤对我有用。

评论

1赞 Paul Carlton 6/5/2019
工程。当我在检查一个分支时,我不小心按下了,它搞砸了我的回购。 没有用,所以我不得不重建这个项目。但是我遇到了这个错误,所以我只是清理并再次重建了该项目,它对我有用。Ctrl Cgitgit reset --hardgit clean -xdf
1赞 TylerH 7/9/2020
在你发布之前,这个答案已经存在了很多年。
1赞 interesting-name-here 5/1/2019 #42

其中许多答案都涉及 Nuget 包和/或清理和重新加载项目。

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

Image of Service Reference Configuration GUI

51赞 Christian Davén 5/3/2019 #43

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

在我重新加载项目之前,在生成或重新生成时不会创建“bin\roslyn”文件夹。

8赞 Juan Martí 5/10/2019 #44

就我而言,只需删除 bin 文件夹中的所有内容并重新编译即可为我完成所有工作。

评论

2赞 David Ortega 5/24/2019
我认为这更简单有效。通常,在将项目从存储库克隆到新计算机后,我会遇到此错误。
0赞 Florian Winter 7/1/2019
尝试此操作后,我在调试器中运行时从 IIS Express 获得了 403 Forbidden。重新启动 Visual Studio 也无济于事,但重新启动 Windows 确实有帮助。
0赞 TylerH 4/28/2021
这重复了几年前 user1903050 的答案马苏德的回答
4赞 Florian Winter 7/1/2019 #45

重新启动 Windows。

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

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

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

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

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

评论

0赞 Jean-Joseph 1/23/2023
关闭 Visual Studio 并从 bin 文件夹中删除内容,然后重新生成/清理解决方案或项目解决了此问题。
0赞 Ray Chung 7/26/2019 #46

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

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

if "$(ConfigurationName)" == "Release" (
goto :release
) else (
goto:exit
)

:release
if 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
3赞 Popo 10/4/2019 #47

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

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

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

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

评论

1赞 russelrillema 11/6/2019
谢谢你。这对我有用。只是想知道您是否知道为什么在第一个 palce 中添加 DotNetCompilerPlatform,通常哪个包会添加这个?
64赞 Henke 10/4/2019 #48

0. 快速修复

正如目前得票最高的答案中已经指出的那样, 快速解决方法是使用包管理器 Nuget 包>工具 管理器>包管理器控制台,以运行

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

Packet Manager Console - how to open

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 文件中提供的示例代码。
如果未进行任何更改,+ 将重现 错误。
CtrlF5

Server Error '/' in Application

2. 更强大的解决方案

另一种解决方案是从项目文件中删除属性。
(与文件位于同一目录中。
如果出现以下情况,这将自动且静默地重新创建您的包 不见了。
Web.configWeb.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 >的标记配置中,编译器>>编译器 language=“c#;cs;csharp“,完全删除 属性。 – 简而言之,删除以 .1typetype="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider,

Visual Studio 将负责其余的工作。 –没有了。Server Error in '/' Application

3. HTTP 错误 403

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

HTTP Error 403.14 - Forbidden

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

A web API containing products


作为挑衅,我尝试从 Visual Studio 项目。
项目完成后,它会自动且静默地重新创建 重建。
package

引用


1 据推测,相同的修复程序也适用于 Visual Basic 至于C#,但我还没有尝试过。

评论

1赞 Henke 6/14/2021
类似:找不到文件...bin\roslyn\csc.exe
2赞 Sebastian Garces 12/28/2022
这解决了我的问题,第 2 点解决了这个问题!谢谢。
0赞 John Lord 10/17/2019 #49

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

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

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

19赞 Shadi Alnamrouti 1/12/2020 #50

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

<system.codedom>
</system.codedom>
3赞 davrob01 1/25/2020 #51

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

  • 更新到最新版本的 Visual Studio 2017(使用安装程序应用)Updating to the latest version of Visual Studio 2017 (using the installer app)

  • 清理并重新生成解决方案

评论

2赞 nickornotto 2/26/2020
清理和重建对我来说已经足够了,因为我已经有了VS2017
64赞 Sunil Johnson 6/1/2020 #52

答案为时已晚,但仍然发布以防它对任何人有帮助。
按照以下步骤为我修复了错误:

  1. 删除包文件夹
  2. 打开 VS
  3. 重建
  4. 观察到 NuGet 包已还原,但未创建 bin\roslyn
  5. 卸载项目
  6. 重新加载项目
  7. 重建
  8. 请注意,bin\roslyn 现已创建。

评论

0赞 Mike Finch 4/25/2023
按照这些步骤为我解决了问题。使用 Visual Studio 2017。
17赞 G. Stoynev 10/15/2020 #53

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

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

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

4赞 Jacek Kołodziejek 3/30/2021 #54

我尝试了多个最佳答案,直到以下步骤奏效(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 脚本。

在此之前,我尝试了许多其他答案(并在失败后运行 git reset --hard)。我不知道他们中是否有人促成了最终的工作。我试过了:

-1赞 mrKva 5/21/2021 #55

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

4赞 Anthony 8/20/2021 #56

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

-1赞 prashant pathak 1/11/2022 #57

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

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

2赞 Felipe Thomé 1/31/2022 #58

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

所以对我来说的解决方案是:

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

你去吧。上面的解决方案都不适合我。希望这对任何人有所帮助

评论

0赞 TylerH 2/1/2022
这似乎重复了许多已经存在的答案。
1赞 the-a-monir 1/10/2023 #59

我在 VS2019 中运行了一个项目,然后我第一次打开(在 VS2019 中)另一个项目,我遇到了上述问题。我做了什么:

  1. 我关闭了正在运行的项目,
  2. 清理并重新生成新项目

只有第 2 点对我不起作用。

2赞 Md Shahriar 8/6/2023 #60

enter image description here

在属性中更改目标框架,然后重新生成项目或生成项目,然后卸载并重新加载项目,然后再次重新生成。