如何在 Web 应用程序 ASPX 代码前页面中使用 C# 7?

How to use C# 7 within Web Application ASPX code-before pages?

(这是对我的问题“”的一种跟进)

我正在尝试在 Visual Studio 2017 中使用 C# 7 功能。

为此,我更新了现有 ASP.NET WebForms 4.6.2 应用程序中的 Microsoft.Net.Compilers NuGet package to v2.0.0-rc4

Visual Studio 2017.

从内部看来效果不错

部署到我的网站时,我看到的只是死机黄屏:

Compiler error with error code 255.

[Detailed compiler output]

Version information: Microsoft .NET Framework version: 4.0.30319; ASP.NET version: 4.6.1590.0

完整的编译器源代码太长,无法在此处发布(超过 30k 个字符),I've uploaded it to Pastebin

我的问题:

是否有机会在 ASP.NET WebForms Web 应用程序中使用最新的 Roslyn 编译器?

更新 1:

当然,我包含了 Microsoft.CodeDom.Providers.DotNetCompilerPlatform NuGet 包和 web.config 个条目,

<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>
</system.codedom>

我什至尝试将上面的 XML 中的 /langversion:6 参数更改为 /langversion:7,结果没有不同。

更新 2:

对于在 .cshtml Razor 文件中的 ASP.NET MVC 视图中使用 C# 7 功能,问题和答案可能是相似的。

更新 3:

我翻阅了事件日志并找到了这些(德语系统,抱歉):

Anwendung: csc.exe    
Frameworkversion: v4.0.30319    
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.    
Ausnahmeinformationen: System.IO.FileLoadException    
   bei Microsoft.CodeAnalysis.CommandLine.BuildClient.GetCommandLineWindows(System.Collections.Generic.IEnumerable'1<System.String>)    
   bei Microsoft.CodeAnalysis.CommandLine.DesktopBuildClient.Run(System.Collections.Generic.IEnumerable'1<System.String>, System.Collections.Generic.IEnumerable'1<System.String>, Microsoft.CodeAnalysis.CommandLine.RequestLanguage, Microsoft.CodeAnalysis.CommandLine.CompileFunc, Microsoft.CodeAnalysis.IAnalyzerAssemblyLoader)    
   bei Microsoft.CodeAnalysis.CSharp.CommandLine.Program.Main(System.String[], System.String[])    
   bei Microsoft.CodeAnalysis.CSharp.CommandLine.Program.Main(System.String[])    

和:

Exception information:     
   Exception type: HttpCompileException     
   Exception message: Eine externe Komponente hat eine Ausnahme ausgelöst.    
  bei System.Web.Compilation.AssemblyBuilder.Compile()    
  bei System.Web.Compilation.BuildProvidersCompiler.PerformBuild()    
  bei System.Web.Compilation.CodeDirectoryCompiler.GetCodeDirectoryAssembly(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories, Boolean isDirectoryAllowed)    
  bei System.Web.Compilation.BuildManager.CompileCodeDirectory(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories)    
  bei System.Web.Compilation.BuildManager.CompileResourcesDirectory()    
  bei System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()    
  bei System.Web.Compilation.BuildManager.CallAppInitializeMethod()    
  bei System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)    

终于解决了

Sysinternals Process Monitor 的帮助下,我发现 csc.exe 试图加载一个名为“csc.exe.config”的文件目前。

所以我将 "csc.exe.config" 文件从我本地网站的 "bin\roslyn" 文件夹复制到我的实时网站的 "bin\roslyn" 文件夹中。

之后,一切正常。

为了安全起见,我也照样复制了"csi.exe.config",虽然这似乎不是必需的,至少在我的测试中是这样。

(配置文件最初不存在的原因是我的发布脚本通常故意忽略配置文件以不覆盖现有配置)。

我遇到了类似的问题,因为该网站有 targetFramework="4.5.2"。 我将它更新到 4.8,重新安装了 Microsoft.CodeDom.Providers.DotNetCompilerPlatform,现在可以使用了。