繁体   English   中英

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

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

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

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

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

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

在此处输入图像描述

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

TL; 博士

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

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

更多信息

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

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

  • 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 上。

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

清洁和重建对我有用!

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

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

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

我们为什么要删除 Roslyn :如果您的项目有 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>

这是执行此操作的更多 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 目录中(而不是在文件夹中)。 不过,该应用程序似乎可以工作。

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

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

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

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

0. 快速修复

正如在当前投票率最高的答案中已经指出的那样,快速修复是使用包管理器Tools > Nuget Package Manager > Package Manager Console来运行

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

Server Error '/' in Application

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 > compilers > compiler language="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 Error 403.14 - Forbidden

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

A web API containing products


作为一种挑衅,我尝试从 Visual Studio 项目中删除整个package目录。
项目一重建,它就会自动、静默地重建。

参考


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

我按照这些步骤操作,效果很好

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

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

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

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

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

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

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

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

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

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

<system.codedom>
</system.codedom>

NuGet 包管理器

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

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

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

Nuget - DotNetCompilerPlatform

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

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

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

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

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

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

就我而言,当 Jenkins 尝试在 Octopus 中部署它时遇到以下错误:

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#: throw invalid expression compilation )并以这种方式解决( How to use C# 7 with Visual Studio 2015? )。 这导致,当我在主程序上安装组件时, Microsoft.Net.Compilers会自动添加它。

解决方案

我的解决方法是,从我们的内部组件中卸载(按照@malikKhalil 回答)

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

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

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

根据上面 Daniel Neel 的评论:

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

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

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

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

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

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

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

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

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

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

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

在我的例子中,类似于 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

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

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

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

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

我最终这样做了:

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

这解决了我的问题。

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

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

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

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

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

在执行以下步骤之前,我尝试了多个最佳答案(ASP.NET 项目针对 .NET Framework 4.6.2,Visual Studio 2019 在具有疯狂限制组策略的系统上,2021 年 3 月)。

我需要:

  • 管理员身份运行 VS

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

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

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

PS。 在此之前,我尝试了许多其他答案(并在失败后运行 git reset --hard )。 我不知道他们中的任何人是否为最终的工作做出了贡献。 我试过了:

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

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

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

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

重新启动 Windows。

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

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

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

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

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

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

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

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

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

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

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

  • 清理并重建解决方案

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

我对Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.06有此错误,但对 @PrisonerZERO 工作的1.0.7也有此错误。 但是,当 Microsoft 发布1.0.8 2017-10-18 时,它终于再次开始为我工作,我不必降级。

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

就我而言,我注意到“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. 清理/重建

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

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

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

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

供参考...

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

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

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

很多这些答案是指 Nuget 包和/或清理和重新加载您的项目。

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

服务参考配置 GUI 的图像

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

<MvcBuildViews>false</MvcBuildViews>

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

我在运行 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>

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

我在发布管道(生成 _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')" />

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

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

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

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

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

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

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

我有一个在 VS2019 中运行的项目,然后我第一次打开(在 VS2019 中)另一个项目,我遇到了上述问题。 我做了如下操作:

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

只点号 2 对我不起作用。

问题

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

使固定

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

$(WebProjectOutputDir)\bin\bin\rosalyn

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

对于网站项目和 Web 应用程序项目,答案是不同的。 根本问题是 NuGet 包在不同机器上的行为不同。 可能是权限问题或某些执行策略阻止它复制到 Bin 文件夹 如您所知 Roslyn 是新编译器。 您应该将它放在这些项目的 Bin 文件夹中转到您的网站 NuGet Packages 检查此文件夹 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 现在作为编译此文件夹的一部分,应该像这样将这个文件夹复制到您的网站下。 \code\WebSite1\Bin\Roslyn 一些你没有发生的事情。 尝试以 Admin 身份运行 Visual Studio。 手动复制 Roslyn 文件夹。 尝试卸载并安装 NuGet 包。 记住这个包编译你的文件夹,如果它不在那里你不能编译任何东西,所以你也不能添加任何东西。 尝试将此包复制到离线版本工具 -> 选项-> nuget 包管理器-> 包源-> Microsoft Visual Studio Offline Packages C:\Program Files (x86)\Microsoft SDKs\NuGetPackages

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

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

安装包 Microsoft.Net.Compilers -Version 3.3.1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM