CodeDom提供程序types“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider”找不到
这是一个使用VS2015的WebApi项目。
重现步骤:
- 创build一个空的WebApi项目
- 将生成输出path从“bin \”更改为“bin \ Debug \”
- 跑
一切正常,直到我改变生成输出path从“bin \”到“bin \ Debug \”实际上,除“bin \”之外的任何输出path将不起作用。
另外一点是,只要我把一个版本留在“bin”中,就有另一个输出path到达任何地方。
请帮助提供解决scheme来解决此问题。 我想这会在实际部署中造成成本问题。
我遇到了同样的问题。 显然.NET编译器没有加载到GAC
。 我做了什么来解决它是:
首先,在包pipe理器控制台中键入:
PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
现在,由于某种原因,微软的绅士们决定不把它安装到我们的GAC上。 您可以通过打开开发人员命令提示符并键入以下命令来手动执行:
gacutil -i "C:\*PATH TO YOUR APP CODE*\bin\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll"
更新
微软试图鼓励大家做所有的事情,可以没有偶然的错误,你用nuget系统遇到的nugets。 另一方面,在许多情况下,将这些文件存储在GAC中可能会导致未来在设置新环境时遇到麻烦。 TMHO,这种头痛和历史上与将文件放入GAC相关的任何其他头痛之间没有显着差异。 如果您决定将dll安装到GAC,请谨慎使用并记住您已经这样做了。 如果你不这样做,那就重新下载每个项目的nuget,并承担由它引起的所有恼人的错误(至less在我终于厌倦它,只是把文件放在GAC中时发生)。 两种方法都可能让你头疼,我个人更喜欢我所知道的头痛
如果您的项目具有Roslyn引用,并将其部署到IIS服务器上 ,则可能会在网站上发生不需要的错误,因为许多托pipe提供程序仍未升级其服务器,因此不支持Roslyn。
要解决此问题, 您需要从项目模板中删除Roslyn编译器 。 删除Roslyn不应该影响你的代码的function。 它对我和我工作的一些其他项目(C#4.5.2)都很好。
执行以下步骤:
-
使用下面的命令行从下面的Nuget Packages中删除( 或者你可以通过右键单击Root Project Solution来使用Nuget Package Manager的GUI并删除它们 )。
PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform PM> Uninstall-package Microsoft.Net.Compilers
-
从您的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=\"Web\" /optionInfer+" /> </compilers>
只需将下一个nuget包添加到您的项目 – Microsoft.CodeDom.Providers.DotNetCompilerPlatform
。
有同样的问题。
我有同样的问题,我的应用程序在Vs2013工作,但更新到Vs2015后得到错误。
- 在Vs2015中,右键单击项目的References文件夹,打开NuGet Package Manager
- 在浏览选项卡下,search“DotNetCompilerPlatform”并安装“Microsoft.CodeDom.Providers.DotNetCompilerPlatform”库
根据您的repro步骤,我认为在应用程序属性中更改输出path是您创build应用程序之后唯一的更改。 这个改变的唯一的事情就是它告诉Visual Studio把MSBuild的输出组件放到新的文件夹中。 然而,在运行时,ASP.Net不会有任何想法,它应该从这个新文件夹而不是\ bin文件夹加载程序集。
这个答案显示了更改WebApi应用程序的构build输出目录的方式。 为了得到同样的错误,你需要在web.config中注释整个<system.codedom>部分。 然后您可以按照说明更改输出path。
在获得应用程序后,您可以取消注释<system.codedom>部分。 如果在应用程序中完全不使用C#6新语法,则可以从应用程序中卸载Microsoft.CodeDom.Providers.DotNetCompilerPlatform; 否则,您可能需要在生成后事件中添加以下命令行,
xcopy /Q /Y "$(TargetDir)roslyn\*.*" "$(TargetDir)..\roslyn\"
新的CodeDom提供程序始终在\ bin中查找“\ roslyn”文件夹。 上述命令作为解决方法,将\ roslyn文件夹从新的输出文件夹复制到\ bin。
在我的实验中,Visual Studio的发布工具将输出程序集发布到部署位置中的\ bin文件夹,无论我的输出path设置如何。 我想你的应用程序仍然应该在实际的部署。
您应该更新项目中的“Microsoft.CodeDom.Providers.DotNetCompilerPlatform”和“Microsoft.Net.Compilers”软件包。
它在生产服务器上发布后停止。 它向我展示这个错误的原因是因为它被部署到一个子文件夹。 在IIS中,我点击右边的子文件夹,并执行“转换为应用程序”,之后它工作。
ASP.NET不像其他types的应用程序那样searchbin/debug
或bin下的任何子文件夹。 您可以指示运行时使用以下configuration在不同的位置查找:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="bin;bin\Debug;bin\Release"/> </assemblyBinding> </runtime> </configuration>
我在解决scheme和Web项目(给出这个错误的问题)有一些项目没有设置为启动项目。 我把这个web项目设置为StartUp项目,并点击菜单项“Debug” – >“Start Debugging”并且工作。 我停止debugging,然后再次尝试,现在它恢复工作。 奇怪的。
我只是有同样的问题,这是因为我移动项目的位置,只需要重新创build虚拟目录。
然后问题又回来了。 我卸载了Microsoft.CodeDom.Providers.DotNetCompilerPlatform和卸载包Microsoft.Net.Compilers,但没有帮助。 然后安装没有帮助。 清理的项目并没有build立任何帮助。 重新启动的服务器没有帮助。然后我注意到该项目需要不是最新的一个当前1.0.5,但1.0.3,因为这是错误无法加载1.0.3版本。 所以我安装了这个DLL版本,而现在它的工作。
在我的情况下,当我在4.5.2中创build了Web应用程序,并在4.6.1中引用了类库时,我得到了错误。 当我将Web应用程序更新到4.5.2版本时,错误消失了。
在我的情况下,这发生在我更改应用程序文件夹的权限和帐户IIS_IUSRS已被删除。 在我重新添加IIS_IUSRS(IISpipe理器 – > YourWebApp – >编辑权限 – >添加IIS_IUSRS)到应用程序文件夹和它的工作。
只需在“Build”菜单中select清除项目名称即可纠正错误