Подтвердить что ты не робот

Распечатайте и/или измените версию С#, которую использует компилятор бритвы для компиляции cshtml

Я хотел бы узнать, какую версию брандмауэра С# использует для компиляции моих шаблонов cshtml. Причина, по которой я хочу этого, - это нарушение.

У нас была lambda в заявлении foreach, которое отлично работало на наших локальных машинах dev, но вызвало ошибку в нашей тестовой среде (в которой нет С# 5). Эта ошибка была очень сложной для отладки (мы даже скопировали все DLL и базы данных тестовой среды и все еще не смогли воспроизвести ошибку).

Итак, чтобы предотвратить эту разницу dev/test в будущем, я хотел бы знать, есть ли способ указать версию С#, которую бритва должна использовать для компиляции файлов cshtml. Было бы неплохо, если бы я мог проверить версию С#, которую использует бритва (путем ее печати).

Обновление: по запросу более подробная информация о том, как это произошло.
Мы используем сетку mvc devexpress для отображения данных в наших режимах бритвы. Чтобы добавить столбцы динамическим способом, мы зацикливаем (foreach) список, который вставляет столбцы в datagrid (используя лямбда). Упрощенный пример:

@Html.DevExpress().GridView(
    settings =>
    {
        settings.Name = "gvDashboard";
        //Some more settings

        settings.Columns.Add(column =>
        {
            column.FieldName = Model.DashboardItems.PropertyName(p => p.Id);
            column.Caption = "Id";
            //Some more column settings
        });

        foreach (var extraColumnLoopVar in Model.ExtraColumns)
        {
            //We added this to solve the problem
            var extraColumn = extraColumnLoopVar; 

            settings.Columns.Add(column =>
            {
                column.Caption = extraColumn.Name;
                //Some more column settings

                column.SetDataItemTemplateContent(content =>
                {
                    Html.ViewContext.Writer.Write(extraColumn.MyValue);
                });
            });
        }
    });
4b9b3361

Ответ 1

Версия бритвы указана в файле Web.config в каталоге представлений. Он должен соответствовать одной из версий в списке зависимых сборок для сборки System.Web.WebPages. Эта запись находится в главном файле Web.config(обычно находится в корне вашего дерева приложений).

Извлечение данных из файлов конфигурации довольно просто. См. ConfigurationManager для этого. Если вы хотите сделать это во время выполнения.

Также можно определить версию Razor на основе ссылочных сборок вашего приложения. Вы можете использовать отражение для этого, здесь фрагмент, который выплескивает все ссылочные сборки:

var sb = new StringBuilder();
Assembly asm = Assembly.GetExecutingAssembly();
sb.AppendLine("File Version:");
sb.AppendLine(asm.FullName);

sb.AppendLine("References :");
AssemblyName[] asmNames = asm.GetReferencedAssemblies();
foreach (AssemblyName nm in asmNames)
{
    sb.AppendLine(nm.FullName);
}

// use sb.ToString() to print out wherever you need to

Очевидно, что могут влиять на производительность, основанные на методе, который вы выбираете для оценки этой информации во время выполнения.

Обновление 1

Из комментариев ниже я беру это, когда вы упоминаете компиляцию, вы ссылаетесь на процесс разбора вида Razor во время компиляции. Существуют и другие понятия "Компиляция Razor View", см. Razor Generator, независимо от того, какой из них вы имеете в виду, и полагаться на ссылку на System.Web.WebPages, которая содержит зависимости библиотеки для самого Razor View Engine. Поэтому, если вы знаете, на какой сборке вы указываете, вы знаете, какую версию Razor вы используете.

Обновление 2

Принимая во внимание, что вас беспокоят конфликты с версией С#, которые вы используете в своих представлениях, вы должны использовать следующее эмпирическое правило: вы всегда должны ссылаться на DLL (System.Web.WebPages), который нацелен на структуру ты используешь. Важно помнить, что структура MVC имеет другую временную шкалу обновлений, чем сам язык. Хорошим примером является ключевое слово async, оно было добавлено к языку сначала, а затем принята каркасом MVC. Обычно новые версии .NET Framework поддерживают обратную совместимость с версией 2.0 и при использовании устаревших материалов вы получаете предупреждения о компиляции. Если вы хотите использовать старые версии фреймворка во время компиляции, вы всегда можете прибегнуть к изменению целевой среды на вашей среде IDE.

В дополнение к тому, чтобы правильно использовать ссылки и целевую структуру, помните, что при настройке веб-приложений в IIS вы указываете пул приложений, привязанный к версии фреймворка. Возможно, вы используете новые возможности платформы .NET, и вы можете ожидать, что они будут работать, потому что у вас установлена ​​новая версия, но ваше приложение работает в пуле приложений другой версии.

Перед тем, как сделать это неприятное смешение между версиями DLL и Frameworks, я буду следовать рекомендациям по обновлению, учитывая, что некоторые из кода, который я реализовал с предыдущей версией, могут не работать должным образом с новым.

Обновление 3

Здесь приведен код для извлечения версии CLR в Runtime, как описано в MSDN.

// Get the common language runtime version.
Version ver = Environment.Version;
Console.WriteLine("CLR Version {0}", ver.ToString());