Компиляция вида 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 бок о бок, верно?!
Шаги воспроизведения:
- Создать новый проект веб-приложения ASP.NET (.NET Framework) для.NET Framework 4.5.1;
- Обновление пакета Microsoft.CodeDom.Providers.DotNetCompilerPlatform до версии 1.0.8;
Добавьте этот класс:
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; } } } }
Измените 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> }
Запустите приложение из Visual Studio (IIS Express) и увидите рабочую страницу "О программе";
- Установите.NET Framework 4.7.1 Dev Pack;
- Запустите приложение еще раз и увидите его сбой...
О проблеме сообщили в сообществе разработчиков Microsoft: https://developercommunity.visualstudio.com/content/problem/150969/mvc-view-compilation-using-wrong-framework.html