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

时间:2015-10-24 15:11:09

标签: c# asp.net asp.net-web-api msbuild

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

重现步骤:

  1. 创建一个空的WebApi项目
  2. 从" bin \"更改构建输出路径到" bin \ Debug \"
  3. 运行
  4. enter image description here

    在我从" bin \"更改构建输出路径之前,一切正常。到" bin \ Debug \" 实际上,除了" bin \"之外的任何输出路径。不会工作。

    另外一点是,只要我在" bin \"中留下一个版本,就可以使用另一个输出路径到任何地方。

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

33 个答案:

答案 0 :(得分:101)

如果您的项目有 Roslyn参考并且您要在 IIS服务器上部署它,那么您可能会在网站上收到不需要的错误,因为许多托管服务提供商仍然没有升级他们的服务器,因此不支持Roslyn。

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

执行以下步骤:

  1. 使用下面显示的命令行从以下Nuget包中删除(或者您可以通过右键单击根项目解决方案并删除它们来使用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>
    

答案 1 :(得分:37)

  

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

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

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

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

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

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

结论

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

答案 2 :(得分:26)

只需将下一个nuget包添加到您的项目中即可 - class Rules { protected $rules = [ 'Apple' => ['color' => 'red', 'seed' => true], 'Banana' => ['color' => 'yellow', 'seed' => false], 'Kiwi' => ['color' => 'green', 'seed' => true] // … ]; }

有同样的问题。

答案 3 :(得分:18)

我遇到的问题与我的应用在Vs2013中有效但在更新到Vs2015后出现错误。

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

答案 4 :(得分: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>

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

答案 5 :(得分:10)

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

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

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

xcopy /Q /Y "$(TargetDir)roslyn\*.*" "$(TargetDir)..\roslyn\"

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

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

答案 6 :(得分:8)

简单方法 - 项目&gt;管理NuGet包...&gt;浏览(标签)&gt; 在搜索输入设置中: Microsoft.CodeDom.Providers.DotNetCompilerPlatform

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

DotNetCompilerPlatform

答案 7 :(得分:4)

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

答案 8 :(得分:3)

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

答案 9 :(得分:3)

另一种可能的解决方案可能是:

  

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

enter image description here

答案 10 :(得分:1)

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

步骤:

  1. 打开IIS

  2. 点击应用程序池

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

  4. 右键单击 - &gt;高级设置

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

  6. 现在选择自定义帐户

  7. 提供您的PC用户名和密码

  8. 保存

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

答案 11 :(得分:1)

关于此错误,我已经尝试过:

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

尽管这些似乎都是有效的解决方案,I was only able to generate new errors,但最后,当缺少某些引用/数字时,错误似乎能够显示。

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

我能够通过将代码重新整理到不需要引用Microsoft.Office的程度来解决此问题,但是可以通过查找所需的软件包并进行相应的安装来解决此问题。

似乎是来自Visual Studio的不清楚的错误消息。

答案 12 :(得分:1)

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

答案 13 :(得分:1)

如果使用的是git,则可能会忽略提交中的.dll

答案 14 :(得分:1)

以下是我解决的方式:

  1. 删除了项目目录中的bin文件夹。
  2. 点击Build Solution。在 VS2017(以管理员身份运行)&gt;构建&gt;构建解决方案

答案 15 :(得分:1)

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

  • ProjectName.csproj中,确保<Import>的{​​{1}}代码存在,并指向正确的版本。

  • Microsoft.CodeDom.Providers.DotNetCompilerPlatform中,确保ProjectName.csproj的{​​{1}}代码存在,并指向<Reference>属性和子代中的正确版本Microsoft.CodeDom.Providers.DotNetCompilerPlatform

  • 在该项目的Include中,确保<HintPath>标记存在,并且其子web.config标记在其{{1}中具有相同的版本属性。

出于某种原因,在我的情况下,将此软件包从1.0.5升级到1.0.8会导致<system.codedom>中的<compiler>标记使其type指向旧版本版本1.0。 5 .0(我在升级软件包后删除了),但其他所有内容都指向新的正确版本1.0。 8 .0。

答案 16 :(得分:1)

我在解决方案中有许多项目,并且Web项目(给出此错误的问题)未设置为StartUp项目。我将此Web项目设置为StartUp项目,然后单击菜单项&#34; Debug&#34; - &gt;&#34; Start Debugging&#34;它起作用了。我停止了调试,然后再次尝试,现在又回来了。怪异。

答案 17 :(得分:1)

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

答案 18 :(得分:1)

就我而言,当我在4.5.2中使用Web应用程序和4.6.1中引用的类库时,我收到了错误。当我将Web应用程序更新到4.5.2版本时,错误就消失了。

答案 19 :(得分:1)

然后问题又回来了。我卸载了Microsoft.CodeDom.Providers.DotNetCompilerPlatform和 卸载 - 打包Microsoft.Net.Compilers但没有帮助。然后安装没有帮助。清理项目并没有帮助。重启服务器没有帮助。然后我注意到项目不需要最新的当前1.0.5但1.0.3,因为错误无法加载1.0.3版本。所以我安装了那个dll版本,现在它可以工作了。

答案 20 :(得分:1)

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

答案 21 :(得分: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>

答案 22 :(得分:0)

如果您看到此消息,则可能是在发布模式下进行构建。 对于生产,您应该发布,而不是在发布模式下进行构建。 对于本地开发,请以调试模式进行构建。

答案 23 :(得分:0)

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

答案 24 :(得分:0)

在我们的例子中,我们使用的是ToroiseSVN,默认情况下,似乎bin文件夹未添加到sourcecontrol中。因此,在生产服务器上更新网站时,未将bin文件夹添加到其中,从而导致此异常。

要将bin文件夹添加到SVN,请转到硬盘上的文件夹,然后找到bin文件夹。右键单击它,然后选择TortoiseSVN->添加

现在更新存储库以包括新添加的文件,然后更新生产服务器。现在一切都会好起来。

答案 25 :(得分:0)

添加对CppCodeProvider程序集的引用。

答案 26 :(得分:0)

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

答案 27 :(得分:0)

转到 从启动命令inetmgr 在IIS管理器控制台中 选择默认网站下的应用程序文件夹 右键单击该文件夹,然后 转换为应用 通过启用来运行.asmx文件 解决了问题

答案 28 :(得分:0)

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

点击“输出”标签,并确保没有类似的内容

  

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

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

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

答案 29 :(得分:0)

我们遇到的异常不在本地而是在远程服务器上,Azure CI正在从packages文件夹中读取它,但是找不到上述编译器版本。

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

这里没有直接引用环境变量的软件包。

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

答案 30 :(得分:0)

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

PM&GT;卸载程序包Microsoft.CodeDom.Providers.DotNetCompilerPlatform

PM&GT;卸载程序包Microsoft.Net.Compilers

然后重新安装 来自nuget经理 enter image description here

答案 31 :(得分:0)

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

答案 32 :(得分:-1)

确保计算机上的Windows功能中启用了Internet信息服务(IIS)。enter image description here