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

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

复制步骤:

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

enter image description here

在我将 Build Output 路径从“ bin”更改为“ bin Debug”之前,一切都运行正常 事实上,除了“ bin”之外的任何输出路径都不能工作

另外一个小问题是,只要我将构建保留在“ bin”中,就可以使用另一个到任何地方的输出路径。

请帮助提供解决方案来解决这个问题。 我想这会在实际部署时造成问题
309788 次浏览

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

回答显示了更改 WebApi 应用程序的构建输出目录的方法。为了得到在那篇文章中显示的完全相同的错误,您需要注释掉 web.config 中的整个 < system. codedom > 部分。然后你可以按照说明改变输出路径。

在完成应用程序的工作之后,您可以取消注释 < system. codedom > 部分。如果你不在你的应用程序中使用 C # 6的新语法,你可以卸载 Microsoft。密码。供应商。从应用程序中添加 DotNetCompilerPlatform; 否则,您可能希望在生成后事件中添加以下命令行,

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

新的 CodeDom 提供程序总是在 bin 中查找“ roslyn”文件夹。上面的命令可以作为解决方案,并将 roslyn 文件夹从新的输出文件夹复制到 bin。

但是,在我的实验中,VisualStudio 的发布工具将输出程序集发布到部署位置的 bin 文件夹,而不管我的输出路径设置如何。我想您的应用程序应该仍然可以在实际部署中工作。

小心遵循这个答案的建议。虽然它解决了手头的问题,但在以后可能会导致不同的问题。

我也有同样的问题。显然。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 系统中偶尔遇到的 bug。尝试在不同的解决方案上使用相同的项目,偶然(或者没有)更新它在其中一个解决方案上使用的许多小技巧中的一个,如果你运气不好,当你尝试构建另一个解决方案时,你就会明白我的意思。另一方面,将文件放入 GAC 也可能导致将来的问题,因为人们往往忘记他们放在那里的是什么,然后在设置新环境时他们忘记包含这些文件。另一个可能的解决方案是将文件放在第三方 dll 的中央文件夹中(尽管调用编译器第三方很奇怪) ,这会在设置新环境时造成引用中断的问题。如果您决定将 dll 安装到 GAC,请谨慎使用,并记住您已经这样做了。如果你不这样做,再次下载每个项目的插件,并承担由它引起的所有恼人的 bug (至少在我最终厌倦它并将文件放入 GAC 时会发生)。这两种方法都可能给您带来麻烦并产生问题,问题只在于您更愿意处理哪些问题。微软建议使用 nuget 系统,而且一般来说,听他们的比听一个不知名的程序员的更好,除非你完全厌倦了 nuget 系统,并且习惯了与 GAC 打交道足够长的时间,使它成为一个更好的选择。

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

  1. 在 Vs2015中,右键单击 project 的 References 文件夹,打开 NuGet Package Manager
  2. 在 Browse 选项卡下,搜索“ DotNetCompilerPlatform”并安装“ Microsoft.CodeDom.Provider.DotNetCompilerPlatform”库

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

也有同样的问题。

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

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

我在解决方案中有许多项目,而且 Web 项目(出现此错误的问题)没有设置为 StartUp 项目。我将这个 web 项目设置为 StartUp 项目,然后点击菜单项“ Debug”-> “ Start Debug”,它工作了。我停止了调试,然后再次尝试,现在它又能工作了。真奇怪。

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

如果您的项目有 罗斯林的参考资料和您部署在 IIS 服务器上,您可能会在网站上得到不必要的错误,因为许多托管提供商仍然没有升级他们的服务器,因此不支持罗斯林。

为了解决这个问题,您需要从项目模板中删除罗斯林编译器。删除 Roslyn 不会影响代码的功能。它对我和其他一些我参与的项目(C # 4.5.2)都很有效。

执行下列步骤:

  1. 使用下面的命令行(或者你可以通过右键单击根项目解决方案并删除它们来使用 Nuget 包管理器的 GUI)从下面的 Nuget 软件包中删除。

    PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
    PM> Uninstall-package Microsoft.Net.Compilers
    
  2. Remove the following code from your Web.Config file and restart IIS. (Use this method only if step 1 doesn't solve your problem.)

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

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

然后问题又来了,我卸载了 Microsoft.CodeDom.Providers.DotNetCompilerPlatformUninstall-package Microsoft.Net.Compilers但没有帮助。然后安装-没有帮助。清理项目,建立没有帮助。重新启动服务器没有帮助。然后我注意到这个项目不需要最新的1.0.5版本,而需要1.0.3版本,因为这个错误不能加载1.0.3版本。所以我安装了 dll 版本,现在它可以工作了。译注:

在我的例子中,当我在4.5.2中使用 Web 应用程序和在4.6.1中使用引用的类库时,我得到了这个错误。当我将 Web 应用程序更新到4.5.2版本时,错误消失了。

它在生产服务器上发布之后就停止了。 它向我显示这个错误的原因是因为它被部署到了一个 潜艇文件夹中。在 IIS 中,我右键点击子文件夹并执行“转换为应用程序”,然后它工作了。译注:

在我的例子中,当我更改应用程序文件夹的权限并且帐户 IIS _ IUSRS 已被删除时,就会发生这种情况。在我将 IIS _ IUSRS (IIS Manager-> YourWebApp-> Edit Permission-> Add IIS _ IUSRS)重新添加到应用程序文件夹及其工作之后。

我知道这是一个老线程,但我想指出 DotNetCompilerPlatform.dll,f. ex 的可能版本问题。更新后。请检查新生成的 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>

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

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

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

步骤:

  1. 打开 IIS

  2. 点击应用程序池

  3. 选择出现问题的应用程序池

  4. 右击-> 高级设置

  5. 点击 < strong > 标识 旁边的三点图标

  6. 现在选择自定义帐户

  7. 给你的电脑用户名和密码

  8. 保存

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

确保在您的机器上的 Windows 特性中启用了 Internet 信息服务(IIS)

简易方法 -Project > Manage NuGet Packages... > Browse (tab) > 管理 NuGet 软件包..在搜索输入设置如下: Microsoft.CodeDom. Provider. DotNetCompilerPlatform

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

DotNetCompilerPlatform

另一种可能的解决办法是:

Something 使用 管理人权利重新启动 VisualStudio 实例

enter image description here

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

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

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

然后再次安装 来自 Nuget 经理 enter image description here

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

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

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

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

出于某种原因,在我的例子中,这个包从1.0.5升级到1.0.8,导致 .csproj中的 <Reference>标记使其 Include指向旧版本1.0。5.0(升级包之后我已经删除了它) ,但是其他的一切都指向新的正确的版本1.0。8.0.

我是这样做的:

  1. 删除了项目目录中的 bin文件夹。
  2. 点击 Build Solution。在 VS2017(作为管理员运行) > 构建 > 构建解决方案

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

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

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

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

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

点击“输出”选项卡,确保你没有这样的东西:

= = = = = = = = = = 重建所有: 14成功,1失败,0跳过 = = = = = = = = = = = = = =

打开你的 bin文件夹,检查它是否是最新的。

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

< p > 转到 Inetmgr from start 命令 在 IIS 管理器控制台中 选择默认网站下的应用程序文件夹 右键点击那个文件夹 转换为应用程序 通过启用 它解决了问题

检查文件中的 BIN文件夹是完全上传还是丢失。

向 CppCodeProvider 程序集添加引用。

关于这个错误,我尝试过:

  • 清洁和重建项目
  • 卸载和重新加载项目
  • 修改目标框架
  • 修改“输出”路径
  • 给广汽添加金块
  • < li > 删除包 uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform 重新安装

虽然这些似乎都是有效的解决方案,我只能生成新的错误和最终,错误似乎能够显示时,某些引用/核心缺失。

在我的例子中,我最近重新安装了 MicrosoftOffice,并引用了像 Microsoft 这样的程序集。办公室。核心。新的安装似乎没有包含所需的软件包,这使得我的解决方案无法正确构建。

我能够通过重新编写代码来解决这个问题,这样我就不需要参考 Microsoft 了。但是可以通过查找所需的软件包并相应地安装它们来解决这个问题。

看起来像是来自 Visual Studio 的一个不清楚的错误消息。

在我的情况下,我的网络项目没有加载正确(它显示项目不可用) ,然后我不得不重新加载我的网络项目后,打开我的视觉工作室在管理模式,然后一切工作正常。

如果您正在使用 git,那么您可能忽略了提交中的. dll

如果您正在从事一个项目,并且刚刚出现了这个错误。重新启动您的计算机(或服务器在我的情况下) ,这为我修复了问题。

如果你看到这个,你可能正在构建 释放模式。 对于 制作,您应该使用 出版而不是在发布模式下构建。 对于 本地发展,在 调试模式下构建。

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

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

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