2017-01-19 7 views
0

У меня есть старое решение, которое было обновлено до C# 6 некоторое время назад, и мы использовали его на протяжении большей части кода. Он имеет большое разнообразие типов проектов из-за его возраста, от старой школы asp.net вплоть до веб-api 2. Однако по некоторым причинам файлы ashx в традиционных проектах asp.net по-прежнему нацелены на C# 5 и так далее мы не можем использовать некоторые новые возможности языка (обратите внимание, что код C# определен в строке в файле ashx, нет отдельного файла ashx.cs). Как обновить компилятор для файлов ashx? Последующий вопрос - как я могу просто наследовать версию компилятора, используемую остальной частью решения?ashx handlers используют старый компилятор C#

+0

Почему вы не обновляете .NET-версию проекта? – Legends

+0

Уже на 4.5.1, на самом деле C# 6 используется в другом месте проекта - это буквально только файлы ashx, которые жалуются – gzak

+0

Что он жалуется? Странно ... но вы можете переписать обработчик без использования ashx, например: 'public class SyncHandler: IHttpHandler'. Затем зарегистрируйте его в файле web.config. Это то же самое. – Legends

ответ

1

Во-первых, знайте, что код, содержащийся в разметке (например, .aspx или .ashx), не скомпилирован так же, как codebehind. Ваш код скомпилирован в DLL, которая разворачивается в папку bin. Между тем, если вы не потрудитесь прекомпилировать файлы .ashx и .aspx, они будут скомпилированы точно в срок. Фактически вы можете изменить разметку непосредственно на веб-сервере, и изменения вызовут перекомпиляцию.

Во-вторых, имейте в виду, что компиляция .ashx сильно изменилась. Раньше считалось, что его компиляция контролируется <BuildProviders> element, который обычно настраивается на System.Web.Compilation.WebHandlerCompilationProvider. Однако, где-то между 2.0 и 4.5, это было устарело в пользу другой конфигурации, используя <Compilers> element. Последнее может быть сконфигурировано так, чтобы указывать версию lanaguge, например.

<system.codedom> 
<compilers> 
    <!-- zero or more compiler elements --> 
    <compiler 
     language="c#;cs;csharp" 
     extension=".cs" 
     type="Microsoft.CSharp.CSharpCodeProvider, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
     compilerOptions="" 
     warningLevel="1" /> 
</compilers> 
</system.codedom> 

Я полагаю, что ваша (очень старая) база кода не настроена должным образом; может случиться так, что он использует старый стиль конфигурации или неверный идентификатор версии.

Мое предложение - переместить разметку .ashx в соответствующий .cs-файл и скомпилировать его вместе со всем другим кодом во время сборки. Это позволит полностью избежать этой проблемы. В противном случае вам нужно будет портировать конфигурации вашего компьютера (эти конфиги не обязательно находятся в вашем web.config) и выровнять их все.