csc*_*h99 143 c# asp.net msbuild asp.net-web-api
这是一个使用VS2015的WebApi项目.
重现步骤:
一切都工作正常,直到我将构建输出路径从"bin \"更改为"bin\Debug \"实际上,除"bin"之外的任何输出路径都不起作用.
还有一点是,只要我在"bin"中留下构建版本,就可以使用另一个输出路径到任何地方.
请帮助提供解决方案.我想这会在实际部署上造成成本问题.
vib*_*006 121
如果您的项目具有Roslyn引用并且您将其部署在IIS服务器上,则可能会在网站上收到不需要的错误,因为许多主机提供商仍未升级其服务器,因此不支持Roslyn.
要解决此问题,您需要从项目模板中删除Roslyn编译器.删除Roslyn不应该影响代码的功能.它对我和我工作的其他一些项目(C#4.5.2)工作得很好.
执行以下步骤:
使用下面显示的命令行从以下Nuget包中删除(或者您可以通过右键单击Root Project Solution并删除它们来使用Nuget包管理器的GUI).
PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers
Run Code Online (Sandbox Code Playgroud)从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>
Run Code Online (Sandbox Code Playgroud)
Yuv*_*man 42
请注意遵循此答案的建议.虽然它解决了手头的问题,但几乎可以肯定会在以后引起不同的问题.
我遇到了同样的问题.显然.NET编译器没有加载到GAC
.我做的是解决它:
首先,在包管理器控制台中输入:
PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Run Code Online (Sandbox Code Playgroud)
现在,出于某种原因,微软的优秀绅士决定不为我们安装它给GAC.您可以通过打开Developer Command Prompt并键入以下内容来手动完成:
gacutil -i "C:\*PATH TO YOUR APP CODE*\bin\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll"
Run Code Online (Sandbox Code Playgroud)
微软试图鼓励每个人使用nuget做所有事情,这可能很好,没有你在nuget系统中遇到的偶然错误.尝试在不同的解决方案上使用相同的项目,不小心(或不)更新它在其中一个上使用的许多nugets中的一个,如果你运气不好,你会看到我在构建另一个解决方案时的意思.另一方面,将文件放入GAC也会导致未来出现问题,因为人们往往会忘记放在那里的内容,然后在设置新环境时他们忘记包含这些文件.另一种可能的解决方案是将文件放在第三方dll的中央文件夹中(即使调用编译器第三方很奇怪),这会在设置新环境时产生损坏引用的问题.如果您决定将dll安装到GAC,请谨慎使用并记住您这样做了.如果你不这样做,请再次为每个项目下载nuget并承担由它引起的所有恼人的错误(至少曾经发生在我最终厌倦了它并将文件放在GAC中时).这两种方法都可能让您头疼并产生问题,这只是您喜欢处理哪些问题的问题.Microsoft建议使用nuget系统,一般来说,最好是听取它们而不是SO中的未知程序员,除非你完全厌倦了nuget系统并且习惯于处理GAC足够长的时间以使它成为更好的选择为了你.
小智 19
我有同样的问题,我的应用程序在Vs2013中工作,但更新到Vs2015后得到错误.
Hen*_*y.K 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=\"Web\" /optionInfer+" />
</compilers>
</system.codedom>
</pre>
Run Code Online (Sandbox Code Playgroud)
更新两行后,错误消失了.
X-M*_*Mao 10
根据您的repro步骤,我假设在创建应用程序后,更改应用程序属性中的输出路径是您唯一的更改.此更改唯一的作用是它告诉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\"
Run Code Online (Sandbox Code Playgroud)
新的CodeDom提供程序始终在\ bin中查找"\ roslyn"文件夹.以上命令用作解决方法,并将\ roslyn文件夹从新的输出文件夹复制到\ bin.
但是,在我的实验中,Visual Studio的发布工具将输出程序集发布到部署位置的\ bin文件夹,而不管输出路径设置如何.我想你的应用程序应该仍然适用于实际部署.
简单方法 - 项目>管理NuGet包...>浏览(选项卡)>在搜索输入中设置:Microsoft.CodeDom.Providers.DotNetCompilerPlatform
您可以安装或更新或卸载并安装此编译器
小智 6
就我而言,当我更改应用程序文件夹的权限并且帐户 IIS_IUSRS 已被删除时,就会发生这种情况。在我将 IIS_IUSRS(IIS 管理器 -> YourWebApp -> 编辑权限 -> 添加 IIS_IUSRS)重新添加到应用程序文件夹后,它就可以工作了。