.NET 4.5 Azure部署中找不到编译器可执行文件csc.exe

10
我有一个网站,它曾经是这样的并且可以运行:
- ASP.NET 4 - MVC 3 - Entity Framework 4.3 - 运行在 Azure Web 角色中(我注意到它的 osFamily="1",这很奇怪,因为我希望它是2,但无论如何...) - Azure SDK 1.7
我已经升级了整个代码库,使其与各种新玩具保持最新。现在它是:
- ASP.NET 4.5 - MVC 4 (Razor 2) - Entity Framework 5 - Azure 配置设置为 osFamily="3" - Azure SDK 1.8(Storage Client Library 被痛苦地升级到了 2 而不是 1.7)
当我在暂存环境中访问该网站时,我会看到一个黄色的死亡屏幕,上面写着“编译器可执行文件 csc.exe 找不到”。我的问题是为什么?
本地和发布模式下都可以正常工作。我远程连接进去后,发现实例肯定在运行 Windows Server 2012(因此是 .NET 4.5 吗?我看到很难判断,因为 .NET 4.5 替换了 .NET 4 文件夹中的 .NET 4 组件)。
根据响应头,它肯定正在运行 IIS 8,但有趣的是它声称 X-ASPNET-VERSION 是 4.xxxx。对于一个 ASP.NET 4 网站来说,这是正常的吗?
更新:
我将 .NET 4 框架作为目标,并将 osFamily 更改为 2,现在可以工作了。因此,我现在怀疑我有一个使用 .NET 3.5 或 2 的第三方程序集(实际上我确定有),但是当针对比导入程序集中引用的 .NET 框架更高的 .NET 框架时,不应该使用更高版本的框架吗?
osFamily="3" 只安装了 .NET 4 和 4.5,所以我想这就是错误的原因,但是我的针对是否正确呢?我想使用 osFamily="3",我该怎么办?
堆栈跟踪:
[InvalidOperationException: Compiler executable file csc.exe cannot be found.]
   System.CodeDom.Compiler.RedistVersionInfo.GetCompilerPath(IDictionary`2 provOptions, String compilerExecutable) +8675071
   Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames) +739
   Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources) +3293761
   Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources) +64
   HibernatingRhinos.Profiler.Appender.Util.GenerateAssembly.Compile(String fileName, String[] sources, IEnumerable`1 assembliesToReference) +1252
   HibernatingRhinos.Profiler.Appender.Util.GenerateAssembly.CompileAssembly(IEnumerable`1 sourcesResources, IEnumerable`1 assembliesToReference, String assemblyName) +118
   HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.SetupDatabaseDefaultConnectionFactoryIfNeeded() +929
   HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.SetupEntityFrameworkIntegration() +80
   HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize(EntityFrameworkAppenderConfiguration configuration) +47
   HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize() +73
   Web4.MvcApplication.Application_Start() +17

[HttpException (0x80004005): Compiler executable file csc.exe cannot be found.]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +12864673
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +175
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +304
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +404
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +475

[HttpException (0x80004005): Compiler executable file csc.exe cannot be found.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +12881540
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +159
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +12722601
5个回答

4

我曾遇到类似的问题。请确保你正在针对正确的编译器进行操作。

我之前针对的是v4.5(但现在已经有v4.0编译器,因此应该使用它)。

在web.config中检查。

<system.web>
 <compilation debug="true" defaultLanguage="c#" optimizeCompilations="true" targetFramework="4.0">
</system.web>

2
如果您使用的是Server 2012,那么您肯定正在运行Fx 4.5而不是4.0,因为它是一种现场升级。
回答您加粗的问题,给定的ASP.NET应用程序一次只能使用一个框架。如果您正在运行4.5站点,则任何2.0/3.5程序集都应该在框架4.5下正常运行。
所以我的猜测是那些旧程序集不是您问题的根源。
话虽如此,我无法解释csc问题。包括您收到的确切错误消息以及一些堆栈跟踪可能会有所帮助。

谢谢David。好的,我的猜测是正确的,关于.NET版本,但现在我已经没有更多的想法了。我已经按要求添加了堆栈跟踪。我注意到了Hibernating Rhinos的东西,所以想知道它是否与EF Prof有关。我不知道为什么,但我可以尝试将其删除。 - BritishDeveloper
2
啊,是的,堆栈很有趣,因为我们看到 csc 并不是由 ASP.NET 启动,而是由 HibernatingRhinos 启动。我看到你在他们的论坛上找到了一个关于这个问题的帖子。感谢你的赏金点数 :) - David Ebbo
David Ebbo!你救了我!我也遇到了HibernatingRhinos生成的这个错误!谢谢你! - Riccardo Bassilichi

1

好的,David Ebbo指引了我正确的方向,我开始仔细研究Entity Framework Profiler。这里有一个链接

关于它在运行时创建程序集的一些内容,似乎osfamily="3"(Server 2012)不允许这样做(在osfamily="2"(Server 2008 R2)上可以工作)。我不想在我的生产环境中使用分析器,所以不会再进行调试。移除EF Profiler后,它可以正常工作。


0
我发帖是希望能帮到某些人。我们正在使用框架的第二个版本动态编译代码,在一个仅支持 .net 4 的服务器上,我们遇到了错误信息。这只是因为我们硬编码了框架版本号:
var provider = new CSharpCodeProvider(new Dictionary<String, String> { { "CompilerVersion", "v3.5" } });

所以这只是一个简单的问题,只需要删除它 - 大概是为了使其与当前使用的框架版本编译。

var provider = new CSharpCodeProvider();

所以错误只是关于需要编译代码,但所需框架版本的编译器不存在。另一个选项就是确保安装了 .net 3.5 功能。


0

我曾经遇到过一个与 AWS Windows Server 2019 镜像相关的类似问题。

CSharpCodeProvider 的 .Net 版本设置为 2.0 是为了兼容性考虑:

 new CSharpCodeProvider(new Dictionary<String, String> { { "CompilerVersion", "v2.0" } });

我已经安装了ASP 4.7功能,我的应用程序工作得很好,除了这个问题。
事实证明,机器上没有安装.Net 2.0。

解决方案-从Windows服务器管理控制台安装.Net 3.5功能。
.Net 3.5附带了.Net 2.0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接