无法找到CodeDom提供程序类型"Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider"

csc*_*h99 143 c# asp.net msbuild asp.net-web-api

这是一个使用VS2015的WebApi项目.

重现步骤:

  1. 创建一个空的WebApi项目
  2. 将构建输出路径从"bin"更改为"bin\Debug"

在此输入图像描述

一切都工作正常,直到我将构建输出路径从"bin \"更改为"bin\Debug \"实际上,除"bin"之外的任何输出路径都不起作用.

还有一点是,只要我在"bin"中留下构建版本,就可以使用另一个输出路径到任何地方.

请帮助提供解决方案.我想这会在实际部署上造成成本问题.

vib*_*006 121

如果您的项目具有Roslyn引用并且您将其部署在IIS服务器上,则可能会在网站上收到不需要的错误,因为许多主机提供商仍未升级其服务器,因此不支持Roslyn.

要解决此问题,您需要从项目模板中删除Roslyn编译器.删除Roslyn不应该影响代码的功能.它对我和我工作的其他一些项目(C#4.5.2)工作得很好.

执行以下步骤:

  1. 使用下面显示的命令行从以下Nuget包中删除(或者您可以通过右键单击Root Project Solution并删除它们来使用Nuget包管理器的GUI).

    PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
    PM> Uninstall-package Microsoft.Net.Compilers
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从Web.Config文件中删除以下代码并重新启动IIS.(仅当步骤1无法解决您的问题时才使用此方法.)

    <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>
    
    Run Code Online (Sandbox Code Playgroud)

  • 我一直坚持"/'应用程序中的服务器错误"大约一天.我正在Visual Studio 2015中编译一个简单的Hello World应用程序,并将其部署到Web服务器,并收到此错误.删除上面的<compiler>行也会使这个问题消失.我想知道这是怎么发生的,以及是否有更好的解决方案.我发现你不能以这种方式部署一个hello world应用程序而不会出现问题令人难以置信,就像MS不做任何测试一样: - ) (4认同)
  • 要启用Roslyn,您可以看到以下文章[在ASP.NET应用程序中启用.NET编译器平台("Roslyn")](https://blogs.msdn.microsoft.com/webdev/2014/05/12/enabling- -net-compiler-platform-roslyn-in-asp-net-applications /)为什么在ASP.NET中编译Roslyn?在ASP.NET应用程序中启用新的Roslyn编译器将带来两个主要好处:*支持新的语言功能*潜在地改进了应用程序启动/预编译时间 (3认同)
  • 当我创建一个新的网络项目时,它附带了那些已经就位的引用。为什么默认安装它们,它们的目的是什么?据我了解,Roslyn 是新的 C# 编译器。删除它如何不会破坏 Visual Studio? (2认同)
  • @vibs2006 链接的文章似乎只是将您带到预览或 github 源代码,这对于希望确保其 Window Server 可以使用代码运行 ASP.NET 站点的系统管理员来说都是无用的。关于“托管服务提供商仍未升级其服务器”的含义,应该有清晰一致的信息。一次升级到底是什么? (2认同)

Yuv*_*man 42

请注意遵循此答案的建议.虽然它解决了手头的问题,但几乎可以肯定会在以后引起不同的问题.

我遇到了同样的问题.显然.NET编译器没有加载到GAC.我做的是解决它:

首先,在包管理器控制台中输入:

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Run Code Online (Sandbox Code Playgroud)

现在,出于某种原因,微软的优秀绅士决定不为我们安装它给GAC.您可以通过打开Developer Command Prompt并键入以下内容来手动完成:

gacutil -i "C:\*PATH TO YOUR APP CODE*\bin\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll"
Run Code Online (Sandbox Code Playgroud)

结论

微软试图鼓励每个人使用nuget做所有事情,这可能很好,没有你在nuget系统中遇到的偶然错误.尝试在不同的解决方案上使用相同的项目,不小心(或不)更新它在其中一个上使用的许多nugets中的一个,如果你运气不好,你会看到我在构建另一个解决方案时的意思.另一方面,将文件放入GAC也会导致未来出现问题,因为人们往往会忘记放在那里的内容,然后在设置新环境时他们忘记包含这些文件.另一种可能的解决方案是将文件放在第三方dll的中央文件夹中(即使调用编译器第三方很奇怪),这会在设置新环境时产生损坏引用的问题.如果您决定将dll安装到GAC,请谨慎使用并记住您这样做了.如果你不这样做,请再次为每个项目下载nuget并承担由它引起的所有恼人的错误(至少曾经发生在我最终厌倦了它并将文件放在GAC中时).这两种方法都可能让您头疼并产生问题,这只是您喜欢处理哪些问题的问题.Microsoft建议使用nuget系统,一般来说,最好是听取它们而不是SO中的未知程序员,除非你完全厌倦了nuget系统并且习惯于处理GAC足够长的时间以使它成为更好的选择为了你.

  • 它不应该在GAC中.Nuget方法背后的重点是让您的项目使用特定版本的C#或VB.NET而不更改主机系统上的任何内容.请参阅MSFT的Damian Edwards的这篇文章:https://blogs.msdn.microsoft.com/webdev/2014/05/12/enabling-the-net-compiler-platform-roslyn-in-asp-net-applications/ (39认同)
  • 这些程序集不属于GAC期间.当需要维护代码的人无法确定使用错误编译器的原因时,将它们放在GAC中会导致最终的问题. (29认同)
  • -1对于Microsoft备注.这些天好像这样做很酷.顺便说一句,nugets有很多优点,使它们非常受欢迎而你忽略了.现在想象微软绅士会想到这一点. (4认同)
  • @YuvalPerelman微软过去3-4年做了很多破坏性的工作(例如破坏Visual Studio的稳定性,生产质量很低的产品)。有时我什至祈祷开发部门的全体管理人员将被解雇。但是,绝对不是这种情况! (2认同)
  • GAC 的这种依赖是我一段时间以来见过的最棒的事情。 (2认同)

Mar*_*ris 28

只需将下一个nuget包添加到您的项目中即可Microsoft.CodeDom.Providers.DotNetCompilerPlatform.

有同样的问题.


小智 19

我有同样的问题,我的应用程序在Vs2013中工作,但更新到Vs2015后得到错误.

  1. 在Vs2015中,右键单击项目的References文件夹,打开NuGet Package Manager
  2. 在"浏览"选项卡下,搜索"DotNetCompilerPlatform"并安装"Microsoft.CodeDom.Providers.DotNetCompilerPlatform"lib

  • 尝试先卸载它,然后再次在NuGet中安装它.这对我有用. (3认同)
  • 感谢您提示右键单击项目的References文件夹以打开包管理器 (2认同)

Hen*_*y.K 15

我知道这是一个旧线程,但我想指出DotNetCompilerPlatform.dll可能的版本问题,f.恩.更新后.请检查新生成的Web.config文件是否与发布的web.config不同,特别是system.codedom部分.在我的情况下,版本从1.0.7更改为1.0.8.新的dll已经被复制到服务器,但我没有更改旧的web.config(使用一些服务器特殊设置):

<pre>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.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.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
</pre>
Run Code Online (Sandbox Code Playgroud)

更新两行后,错误消失了.

  • 如果删除版本属性,也将起作用并防止在下次更新时再次引发错误. (2认同)

X-M*_*Mao 10

根据您的repro步骤,我假设在创建应用程序后,更改应用程序属性中的输出路径是您唯一的更改.此更改唯一的作用是它告诉Visual Studio将MSBuild的输出程序集放入新文件夹中.但是,在运行时,ASP.Net不会知道它应该从这个新文件夹而不是\ bin文件夹加载程序集.

这个答案显示了更改WebApi应用程序的构建输出目录的方法.要获得该帖子中显示的完全相同的错误,您需要注释掉web.config中的整个<system.codedom>部分.然后您可以按照说明更改输出路径.

在您的应用程序工作后,您可以取消注释<system.codedom>部分.如果您根本不在应用程序中使用C#6新语法,则可以从您的应用程序中卸载Microsoft.CodeDom.Providers.DotNetCompilerPlatform; 否则,您可能希望在后期构建事件中添加以下命令行,

xcopy /Q /Y "$(TargetDir)roslyn\*.*" "$(TargetDir)..\roslyn\"
Run Code Online (Sandbox Code Playgroud)

新的CodeDom提供程序始终在\ bin中查找"\ roslyn"文件夹.以上命令用作解决方法,并将\ roslyn文件夹从新的输出文件夹复制到\ bin.

但是,在我的实验中,Visual Studio的发布工具将输出程序集发布到部署位置的\ bin文件夹,而不管输出路径设置如何.我想你的应用程序应该仍然适用于实际部署.


New*_*red 9

简单方法 - 项目>管理NuGet包...>浏览(选项卡)>在搜索输入中设置:Microsoft.CodeDom.Providers.DotNetCompilerPlatform

您可以安装或更新或卸载并安装此编译器

DotNetCompilerPlatform


Leg*_*nds 7

另一个可能的解决方案:

使用管理员权限重新启动Visual Studio实例

在此处输入图片说明


小智 6

就我而言,当我更改应用程序文件夹的权限并且帐户 IIS_IUSRS 已被删除时,就会发生这种情况。在我将 IIS_IUSRS(IIS 管理器 -> YourWebApp -> 编辑权限 -> 添加 IIS_IUSRS)重新添加到应用程序文件夹后,它就可以工作了。


Mar*_*etz 5

在生产服务器上发布后就停止了。它向我显示此错误的原因是因为它被部署到文件夹中。在 IIS 中,我右键单击子文件夹并执行“转换为应用程序”,之后它就起作用了。