找不到CodeDom提供程序类型“ Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider”


159

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

复制步骤:

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

在此处输入图片说明

在将“生成输出”路径从“ bin \”更改为“ bin \ Debug \”之前,一切工作正常,实际上,除“ bin \”以外的任何输出路径均无效。

另外一点是,只要我将构建保留在“ bin \”中,就可以在任何地方都具有另一个输出路径。

请帮助提供解决方案以解决此问题。我想这会在实际部署上带来问题。


请问为什么您更改了Web应用程序的输出路径?谢谢。
X-Mao

每次在msbuild编译期间刷新以前运行的ASP.NET MVC应用程序时,都会发生此异常。
Nikolay Kostov 2015年

这样的事情我也经历过。它是在我添加对几个.dll库的引用后开始的。我通过卸载并重新安装库来修复它。而没有的为什么会这样..任何想法
Letie Techera

Answers:


127

如果您的项目具有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
  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>


4
我被困在“'/'应用程序中的服务器错误”大约一天了。我正在Visual Studio 2015中编译一个简单的Hello World应用程序,并将其部署到Web服务器,并收到此错误。删除上面的<compiler>行也使此问题消失了。我想知道这是怎么发生的以及是否有更好的解决方案。我觉得很难以这种方式部署hello world应用程序而不会遇到问题,就像MS一样,它不做任何测试:-)
user2728841

4
要启用Roslyn,您可以看到以下文章 在ASP.NET应用程序中启用.NET编译器平台(“ Roslyn”)。 为什么在ASP.NET中进行Roslyn编译?在ASP.NET应用程序中启用新的Roslyn编译器将带来两个主要好处:*支持新的语言功能*潜在地缩短了应用程序的启动/预编译时间
vibs2006 17/05/23

1
当我创建一个新的Web项目时,它附带了这些引用。为什么默认情况下安装它们,它们的用途是什么?据我了解,Roslyn是新的C#编译器。如何删除它不会破坏Visual Studio?
詹斯·曼德

@JensMander都是编译运行时。在IIS中,我们需要手动启用Roslyn编译器。请参阅我先前对文章的评论中的链接'Enabling the .NET Compiler Platform.
vibs2006

我遇到了同样的错误,最后为我解决了Microsoft.CodeDom.Providers.DotNetCompilerPlatform的最新软件包。
红色

48

请注意遵循此答案的建议。它可以解决当前的问题,但以后可能会引起其他问题。

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

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

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

现在,由于某种原因,Microsoft的好先生们决定不为我们将其安装到GAC。您可以通过打开“开发人员命令提示符”并键入以下内容来手动完成此操作:

gacutil -i "C:\*PATH TO YOUR APP CODE*\bin\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll"

结论

Microsoft尝试鼓励每个人都使用nuget进行所有操作,这可能会很好,而不会遇到nuget系统偶尔遇到的错误。尝试在不同的解决方案上使用同一项目,不小心(或不)更新它在其中一个上使用的许多nuget中的一个,如果不幸的话,当您尝试构建另一个解决方案时,您会明白我的意思。另一方面,将文件放入GAC也会引起将来的问题,因为人们往往会忘记放置在GAC中的内容,然后在设置新环境时会忘记包括这些文件。另一种可能的解决方案是将文件放在第3方dll的中央文件夹中(尽管调用编译器3rd有点奇怪),这在设置新环境时会产生引用中断的问题。如果您决定将dll安装到GAC,谨慎使用,并记住您是这样做的。如果您不这样做,请再次为每个项目下载nuget,并承担由它引起的所有烦人的bug(至少在我最后厌倦了它并将其放在GAC中后,这种情况经常发生)。两种方法都可能使您头疼并产生问题,这只是您要处理哪些问题的问题。微软建议使用nuget系统,通常,最好听一听它们,而不是SO中一个未知的程序员,除非您完全厌倦了nuget系统,并且使用GAC的时间足够长,以使其成为更好的选择为了你。再次为每个项目下载nuget,并承担由它引起的所有烦人的bug(至少在我最后厌倦了它并将其放在GAC中后,这种情况经常发生)。两种方法都可能使您头疼并产生问题,这只是您要处理哪些问题的问题。微软建议使用nuget系统,通常,最好听一听它们,而不是SO中一个未知的程序员,除非您完全厌倦了nuget系统,并且使用GAC的时间足够长,以使其成为更好的选择为了你。再次为每个项目下载nuget,并承担由它引起的所有烦人的bug(至少在我最后厌倦了它并将其放在GAC中后,这种情况经常发生)。两种方法都可能使您头疼并产生问题,这只是您要处理哪些问题的问题。微软建议使用nuget系统,通常,最好听一听它们,而不是SO中一个未知的程序员,除非您完全厌倦了nuget系统,并且使用GAC的时间足够长,以使其成为更好的选择为了你。


40
它不应该在GAC中。Nuget方法背后的全部要点是让您的项目使用特定版本的C#或VB.NET,而无需更改主机系统上的任何内容。请参阅MSFT的达米安·爱德华兹(Damian Edwards)的这篇文章:blogs.msdn.microsoft.com/webdev/2014/05/12/…–
Sudhanshu Mishra

29
这些程序集不属于GAC时期。当需要维护您的代码的人无法确定为什么使用错误的编译器时,将它们放置在GAC中将最终导致头痛。
EKW

5
-1为Microsoft备注。这些天似乎很酷。顺便说一句,nuget有很多优势,使它们非常受欢迎,而您只是忽略了。现在想象一下微软先生会怎么看。
Fabio Milheiro '17

2
@YuvalPerelman微软过去3-4年做了很多破坏性的工作(例如破坏Visual Studio的稳定性,生产质量很低的产品)。有时我什至祈祷开发部门的整个管理被解雇。但是,绝对不是这种情况!
马里斯'18

2
GAC对这种依赖关系是我一段时间以来最出色的事情。
Svend

31

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

有同样的问题。


请小心一点;它会覆盖web.config中的'compilerOptions',因此请确保在安装之前保存所有自定义值。
Radderz

19

我遇到了与我的应用程序在Vs2013中可以使用的问题相同的问题,但是在更新到Vs2015之后却出现了错误。

  1. 在Vs2015中,右键单击项目的“引用”文件夹,以打开NuGet软件包管理器
  2. 在“浏览”选项卡下,搜索“ DotNetCompilerPlatform”并安装“ Microsoft.CodeDom.Providers.DotNetCompilerPlatform”库

2
感谢您提供的技巧,请重新右键单击项目的“引用”文件夹以打开包管理器
garyh

3
尝试先将其卸载,然后在NuGet中再次安装。那对我有用。
马特

你是一个传奇
莫d创

16

我知道这是一个旧线程,但我想指出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>

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


1
我有DotNetCompilerPlatform问题, 一个 时间更新它。
拉里·布德(LarryBud)

2
如果删除了版本属性,则也将起作用,并防止在下次更新时再次引发该错误。
MiguelSlv '18

我只遇到过相同的问题,除了我必须更新2.0.02.0.1
Rory McCrossan,

12

根据您的复制步骤,我假设更改应用程序属性中的输出路径是您创建应用程序后的唯一更改。所做的唯一更改是,它告诉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\"

新的CodeDom提供程序始终在\ bin中寻找“ \ roslyn”文件夹。上面的命令是一种解决方法,并将\ roslyn文件夹从新的输出文件夹复制到\ bin。

但是,在我的实验中,无论我的输出路径设置如何,Visual Studio的发布工具都会将输出程序集发布到部署位置的\ bin文件夹中。我猜您的应用程序仍然可以在实际部署中正常工作。


10

简单方法- 项目>管理NuGet软件包...>浏览(标签)>在搜索输入中将此设置为:Microsoft.CodeDom.Providers.DotNetCompilerPlatform

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

DotNetCompiler平台


8

另一个可能的解决方案:

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

在此处输入图片说明


4

在生产服务器上发布后停止。之所以向我显示此错误,是因为它已部署到文件夹中。在IIS中,我在子文件夹上单击鼠标右键,并喊出“转换为应用程序”,此后它起作用了。


只需转换为应用程序即可。(这是一个之前从未发布过的新项目。)
Patrick

使用子文件夹也是我的问题,因此我移至基本文件夹,一切开始正常工作。
J_L

4

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


我添加了IUSR权限,但这还不够。我必须添加“ IIS_IUSRS”,然后它才能工作。
zacharydl '18

3

这是我的解决方法

  1. 删除了bin项目目录中的文件夹。
  2. 点击Build Solution。在VS2017(以管理员身份运行)> Build> Build Solution中


2

解决方案中有多个项目,并且未将Web项目(出现此错误的问题)设置为StartUp项目。我将此Web项目设置为StartUp项目,然后单击菜单项“ Debug”->“ Start Debugging”,它开始工作。我停止调试,然后再次尝试,现在它又恢复了工作。奇怪的。


2

然后问题又回来了。我都卸载了Microsoft.CodeDom.Providers.DotNetCompilerPlatformUninstall-package Microsoft.Net.Compilers但没有帮助。然后安装-没有帮助。清理项目,没有帮助。重新启动服务器没有帮助。然后我注意到该项目不需要最新的项目(当前为1.0.5),而需要的是1.0.3,因为该错误无法加载1.0.3版本。所以我改为安装了该dll版本,现在可以使用了。


1

ASP.NET不会bin/debug像其他类型的应用程序一样搜索程序集或bin下的任何子文件夹来寻找程序集。您可以使用以下配置指示运行时在其他位置查看:

<configuration>
   <runtime>   
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin\Debug;bin\Release"/>
      </assemblyBinding>
   </runtime>   
</configuration>

1

您应该在项目中更新“ Microsoft.CodeDom.Providers.DotNetCompilerPlatform”和“ Microsoft.Net.Compilers”包。


1

就我而言,当我在4.5.2中拥有Web应用程序并且在4.6.1中拥有引用的类库时,出现了错误。当我将Web应用程序更新为4.5.2版本时,错误消失了。


安装Umbraco 8时确实出现了相同的错误,因为错误的.Net版本(需要4.7.2)而不是4.5.2(默认为VS 2017)
Bunkerbuster

1

我收到此错误是因为我的应用程序池用户设置为ApplicationPoolIdentity。我将其更改为可以访问该文件夹的用户/服务帐户,该错误消失了。


1

这是我的发现。今天早上我也遇到了这个问题。我只是将当前用户添加到运行该应用程序的应用程序池中。

脚步:

  1. 打开IIS

  2. 点击应用程序池

  3. 选择遇到问题的应用程序池

  4. 右键单击->高级设置

  5. 单击标识旁边的三个点图标

  6. 现在选择自定义帐户

  7. 输入您的PC用户名和密码

  8. 保存

刷新您的应用程序..它将开始工作。访问dll存在一些安全问题。


1

只需从下面的命令从软件包管理器控制台中卸载软件包

PM>卸载软件包Microsoft.CodeDom.Providers.DotNetCompilerPlatform

PM>卸载Microsoft.Net.Compilers软件包

然后从nuget Manager重新安装 在此处输入图片说明


1

如果您最近安装或更新了该Microsoft.CodeDom.Providers.DotNetCompilerPlatform软件包,请仔细检查项目中引用的该软件包的版本是否指向该软件包的正确且相同的版本:

  • 在中ProjectName.csproj,确保存在的<Import>标记,Microsoft.CodeDom.Providers.DotNetCompilerPlatform并指向正确的版本。

  • 在中ProjectName.csproj,确保在属性和child中都存在的<Reference>标记Microsoft.CodeDom.Providers.DotNetCompilerPlatform,并指向正确的版本。Include<HintPath>

  • 在该项目的中web.config,确保<system.codedom>存在标签,并且其子<compiler>标签的type属性具有相同的版本。

出于某种原因,在我的情况下,从1.0.5至1.0.8,这个包的升级导致了<Reference>在标签.csproj有其Include指向旧版本1.0。5 .0(升级软件包后删除了该文件),但其他所有内容均指向新的正确版本1.0。8 .0。


1

确保您的项目已完全构建!

单击“输出”选项卡,并确保没有以下内容:

==========全部重建:14个成功,1个失败,0个跳过==========

并打开您的bin文件夹,并检查其是否最新。

一开始我忽略了很多打字稿错误,忘记了它们破坏了版本并导致没有DLL被复制。



1

在我的情况下,我的Web项目未正确加载(显示项目不可用),然后在以管理模式打开Visual Studio之后必须重新加载Web项目,然后一切正常。


0

我只是遇到了同样的问题,这是因为我移动了项目位置,只需要重新创建虚拟目录即可。


0

我们遇到的一个例外不在本地,而是在远程服务器上,Azure CI正在从程序包文件夹中读取它,但未找到上述编译器版本。

为了解决这个问题,我们修改了项目文件,使其类似于

它没有在这里直接引用环境变量的任何包。

这解决了问题,但是在我们的情况下,我们不直接使用“ package.config”中的软件包,而是拥有一个单独的文件夹来维护团队之间的版本完整性。


0

从启动命令转到inetmgr在IIS管理器控制台中,选择“默认网站”下的应用程序文件夹,右键单击该文件夹,然后转换为应用程序。


0

检查BIN文件夹是否已完全上传或文件中丢失。


我也面临着同样的问题,这对asp.net来说是很
陌生的

0

关于此错误,我尝试了:

  • 清理和重建项目
  • 卸载和重新加载项目
  • 修改目标框架
  • 修改输出路径
  • 将块添加到GAC
  • 删除软件包uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform uninstall-package Microsoft.Net.Compilers并重新安装。

虽然所有这些似乎都是有效的解决方案,但我只能生成新的错误,最后,当缺少某些引用/小数字时,该错误似乎能够显示。

就我而言,我最近重新安装了Microsoft Office,并引用了Microsoft.Office.Core之类的程序集。新安装的似乎没有包括所需的软件包,因此无法正确构建我的解决方案。

我可以通过重新编写代码到不需要引用Microsoft.Office的方式来解决此问题,但是可以通过查找所需的程序包并进行相应的安装来解决此问题。

好像是来自Visual Studio的不清楚的错误消息。


0

如果您一直在从事一个项目,而现在却作为错误弹出。重新启动您的计算机(或我的服务器),这为我解决了这个问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.