我使用的是Microsoft Visual Studio 2015,我使用C#联系表单构建了一个简单的网站。当我在localhost上编译和运行时,它运行得非常好。但是,当我尝试发布它(在smarterasp.net上)时,我收到一个错误:
[Win32Exception(0x80004005):访问被拒绝]
[ExternalException(0x80004005):无法执行程序。正在执行的命令是“.. \ bin \ roslyn \ csc.exe”
我联系过smarterasp.net,他们说他们不允许.exe文件。我试图从服务器上删除带有ftp的csc.exe,但是当我这样做时,我收到错误:
找不到文件“.. \ bin \ roslyn \ csc.exe”。
如何使用试图包含在我的项目中的csc.exe解决此问题,以便我可以发布我的这个网站?
经过几个小时的研究,我想出了解决方案。
自.NET 4.5版本以来,Roslyn编译是默认的编译方式。这意味着如果您使用.NET 4.5创建任何Web应用程序Web窗体或MVC,您将在项目中预先安装此Roslyn csc.exe编译。
基本上我需要的是在没有Roslyn或任何.exe文件的情况下编译和部署我的项目。
所以这里的解决方案对我有用。您可以在没有Roslyn的情况下进行部署而无需更改代码:
这将解决您的目的。基本上这不会在bin文件夹中生成任何csc.exe,vbc.exe文件。
我希望它对你也有用!
我有同样的错误,我通过启用托管目录的权限(读/写/删除)解决了它。
tl; dr:确保csc.exe的大小不是零字节。
更长的答案
添加另一个原因和解决方案:在我的情况下,我在浏览器中得到了这个黄色死亡屏幕:
'/'应用程序中的服务器错误。
编译错误
描述:编译服务此请求所需的资源时发生错误。请查看以下特定错误详细信息并相应地修改源代码。
编译器错误消息:编译器失败,错误代码为255。
c:\ windows \ system32 \ inetsrv> C:\ inetpub \ wwwroot \ bin \ roslyn \ csc.exe / t:library / utf8output / nostdlib + ...
版本信息:Microsoft .NET Framework版本:4.0.30319; ASP.NET版本:4.7.2558.0
经过调查,我通过在CMD窗口中执行它来隔离对csc.exe的调用:
c:\inetpub\wwwroot\bin\roslyn\csc.exe
我收到了这个消息框:
在CMD窗口中跟随此行:
访问被拒绝。
检查Windows文件资源管理器中的文件后,我发现csc.exe的大小为零字节。
我不确定我的部署脚本发生在哪个阶段,但是在用实际工作的csc.exe替换0字节大小的csc.exe后,一切正常。
上述解决方案对我不起作用并且不正确,因为这些天roslyn不是可选的。
有效的是确保池帐户对Web应用程序的根文件夹具有读取和执行权限。您可以通过查找Web应用程序使用的池名称,然后找到应用程序池 - >池名称 - >高级设置 - >标识,找到要授予此权限的帐户。
我的VPS主机使用非标准目录进行托管,如下所示:
c:\home\web.app.name\wwwroot
web.app.name文件夹需要该权限。
将nuget包Microsoft.CodeDom.Providers.DotNetCompilerPlatform
更新到最新版本(当时)2.0.1
为我解决了这个问题,而无需向该文件夹授予权限或删除编译器。
我在Smarter ASP上遇到过这个问题。在控制面板中的浏览器文件管理器上,导航到bin中的'Roslyn'文件夹并设置.net权限以进行读/写。它起作用了。
如果你真的想保留roslyn codegen,你只需要在应用程序的bin文件夹上设置权限,以允许ApplicationPool用户Read&Execute。
我使用文件夹属性对话框中的资源管理器“安全”选项卡执行此操作,但您还应该能够执行以下操作:
icacls PATH_TO_SERVICE_BIN /grant "ApplicationPoolUser":(OI)(CI)RX
只需从Web.config中删除codedom部分,就可以解决问题。
刚刚在VS2015中通过Web部署发布ASP.net 4.5.2 SPA时遇到了与OP相同的问题。
我发现工作的解决方案是删除Nuget包“Microsoft.CodeDom.Providers.DotNetCompilerPlatform”。
或者,您可以从Web.config文件中删除system.codedom编译器配置部分,这会产生相同的影响。
只需在Smarterasp.net文件管理器中为/bin
文件夹设置rw访问权限,如下所示,重新启动您的应用程序
以下是我如何使用它:
Web.config
中,设置完全信任(这将让你运行它们)
<configuration>
<system.web>
<trust level="Full" />
</system.web>
</configuration>