Как использовать C# 7 в веб-приложении ASPX code-before pages?
(это своего рода продолжение моего вопроса "Как использовать C# 6 с типом проекта веб-сайта?")
Я пытаюсь использовать функции C# 7 в Visual Studio 2017.
Для этого, я обновил Microsoft.Net.Compilers
пакет NuGet до V2.0.0-RC4 и в мой существующий ASP.NET форм приложение 4.6.2.
Это, кажется, хорошо работает изнутри Visual Studio 2017.
Когда я разворачиваюсь на своем веб-сайте, все, что я вижу, - это желтый экран смерти:
Ошибка компилятора с кодом ошибки 255.
[подробный вывод компилятора]
Сведения о версии: Microsoft .NET Framework версия: 4.0.30319; ASP.NET версия: 4.6.1590.0
Полный исходный код компилятора слишком длинен, чтобы быть опубликованным здесь (более 30k символов), я загрузил его в Pastebin.
Мой вопрос:
Есть ли шанс использовать последний компилятор Roslyn в рамках ASP.NET веб-формы веб-приложения?
Обновление 1:
Конечно, я включил пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform
NuGet и web.записи конфигурации, как описано здесь .
<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>
</system.codedom>
Я даже пытался изменить параметр /langversion:6
в приведенном выше XML на /langversion:7
без какого-либо другого результата.
Обновление 2:
Вероятно, вопрос и ответ были бы аналогичны для использования функций C# 7 изнутри ASP.NET MVC смотрит внутрь .файлы бритвы cshtml.
Обновление 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)
1 ответ:
Наконец, я решил ее.
С помощью Sysinternals Process Monitor я обнаружил, что csc.exe пытается загрузить файл под названием " csc.exe.config ", которого не было.
Поэтому я скопировал "csc.exe.файл config" от моего местного сайта "папке bin\Рослин" на мой живой сайт "в папке bin\Рослин".
После этого все работает, как и ожидалось.
На всякий случай я также скопировал "csi.exe.config" таким же образом, хотя кажется, что это не так требуется, по крайней мере, в моих тестах.
(причина, по которой конфигурационные файлы изначально отсутствовали, заключается в том, что мои сценарии публикации обычно намеренно игнорируют конфигурационные файлы, чтобы не перезаписывать существующие конфигурации).