Компиляция вида MVC с использованием неверного.NET Framework

Существующее веб-приложение использует.NET Framework 4.5.1. В проекте для параметра MvcBuildViews установлено значение true. В проекте также используется метод расширения Prepend для IEnumerable.

Вещи чудом ломаются после простой установки пакета разработчика.NET Framework 4.7.1.

Несмотря на то, что web.config по-прежнему предназначен для Framework 4.5.1:

<system.web>
    <compilation debug="true" targetFramework="4.5.1" />
    <httpRuntime targetFramework="4.5.1" />
    ...

во время выполнения представление представляется скомпилированным с использованием 4.7.1, что приводит к неоднозначному вызову (поскольку 4.7.1 имеет свое собственное расширение Prepend):

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

Сообщение об ошибке компилятора: CS0121: вызов неоднозначен между следующими методами или свойствами: 'System.Linq.Enumerable.Prepend(System.Collections.Generic.IEnumerable, TSource)' и 'WebApplication2.EnumerableExtensions.Prepend(System.Collections.Generic).. Неисчислимо, T)'

Как решить эту проблему, не обновляя все приложения до 4.7.1? Должно быть возможно использовать 4.5.1 и 4.7.1 бок о бок, верно?!

Шаги воспроизведения:

  1. Создать новый проект веб-приложения ASP.NET (.NET Framework) для.NET Framework 4.5.1;
  2. Обновление пакета Microsoft.CodeDom.Providers.DotNetCompilerPlatform до версии 1.0.8;
  3. Добавьте этот класс:

    public static class EnumerableExtensions
    {
        public static IEnumerable<T> Prepend<T>(this IEnumerable<T> source, T item)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }
    
            return Iterator();
    
            IEnumerable<T> Iterator()
            {
                yield return item;
                foreach (var i in source)
                {
                    yield return i;
                }
            }
        }
    }
    
  4. Измените About.cshtml на это:

    @{
        ViewBag.Title = "About";
        var a = new List<string> { "a", "b" };
        a.Prepend("c");
    }
    <h2>@ViewBag.Title.</h2>
    <h3>@ViewBag.Message</h3>
    
    <p>Use this area to provide additional information.</p>
    @foreach (var s in a)
    {
        <h4>@s</h4>
    }
    
  5. Запустите приложение из Visual Studio (IIS Express) и увидите рабочую страницу "О программе";

  6. Установите.NET Framework 4.7.1 Dev Pack;
  7. Запустите приложение еще раз и увидите его сбой...

О проблеме сообщили в сообществе разработчиков Microsoft: https://developercommunity.visualstudio.com/content/problem/150969/mvc-view-compilation-using-wrong-framework.html

0 ответов

Другие вопросы по тегам