繁体   English   中英

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

[英]The CodeDom provider type "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider" could not be located

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

重现步骤:

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

    在此处输入图像描述<\/a>

    在我将构建输出路径从“bin\\”更改为“bin\\Debug\\”之前,一切都运行良好。事实上,除“bin\\”之外的任何输出路径都不起作用。

    还有一点额外的事情是,只要我在“bin\\”中留下一个构建,就可以使用另一个输出路径到任何地方。

    请帮助提供解决方案来解决这个问题。 我想这会在实际部署中产生成本问题。

如果您的项目有Roslyn 引用<\/strong>,并且您将其部署在IIS 服务器上<\/strong>,您可能会在网站上收到不必要的错误,因为许多托管服务提供商仍未升级其服务器,因此不支持 Roslyn。

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

执行以下步骤:

  1. 使用如下所示的命令行从以下 Nuget 包中删除(或者您可以通过右键单击根项目解决方案并删除它们来使用 Nuget 包管理器的 GUI<\/em> )。

  2. 从您的 Web.Config 文件中删除以下代码并重新启动 IIS<\/strong> 。 仅当步骤 1 不能解决您的问题时才使用此方法。<\/em> )

请注意遵循此答案的建议。<\/strong> 虽然它解决了手头的问题,但它可能会在以后导致不同的问题。<\/strong>

<\/blockquote>

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

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

现在,出于某种原因,微软的好先生们决定不为我们将它安装到 GAC。 您可以通过打开开发人员命令提示符并键入以下内容手动执行此操作:

结论<\/h2>

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

"

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

有同样的问题。

我的应用程序在 Vs2013 中运行时遇到相同的问题,但在更新到 Vs2015 后出现错误。

  1. 在 Vs2015 中,右键单击项目的 References 文件夹,打开 NuGet 包管理器<\/li>
  2. 在浏览选项卡下,搜索“DotNetCompilerPlatform”并安装“Microsoft.CodeDom.Providers.DotNetCompilerPlatform”库<\/li><\/ol>"

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

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

另一种可能的解决方案:<\/strong>

➜ 使用管理员权限<\/strong>重新启动您的 Visual Studio 实例

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

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

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

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

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

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

点网编译器平台

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

"

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

这是我解决它的方法:

  1. 删除了项目目录下的bin文件夹。
  2. 单击Build Solution VS2017(以管理员身份运行)> 构建 > 构建解决方案

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

"

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

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

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

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

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

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

PM> 卸载包 Microsoft.Net.Compilers

然后从 nuget manager 再次安装在此处输入图像描述

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

"

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

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

"

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

脚步:

  1. 打开 IIS

  2. 单击应用程序池

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

  4. 右键->高级设置

  5. 点击身份旁边的三点图标

  6. 现在选择自定义帐户

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

  8. 保存

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

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

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

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

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

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

确保您的项目已完全构建!<\/h3>

单击“输出”选项卡并确保您没有类似的内容:

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

并打开您的bin<\/code>文件夹并检查它是否是最新的。

我一开始忽略了一大堆打字稿错误,忘记了它们破坏了构建并导致没有复制 DLL。

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

"

添加对 CppCodeProvider 程序集的引用。

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

"

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

"

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

"

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

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

它没有引用此处直接引用环境变量的任何包。

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

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

关于这个错误我试过:

如果您看到这可能是您正在构建发布模式 对于生产,您应该发布而不是在发布模式下构建。 对于本地开发调试模式构建。

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

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

现在更新存储库以包含新添加的文件,然后更新生产服务器。 现在一切都应该好了。

确保计算机的Windows功能中启用了Internet信息服务(IIS)。 在此处输入图片说明

暂无
暂无

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

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