Как приложение .NET 4.5.2 может компилироваться на сервере сборки, на котором установлена ​​только версия 4.5.1?

Это меня совершенно сбило с толку. Я тестирую обновление нашей инфраструктуры сборки до .NET 4.5.2, которая в настоящее время находится на .NET 4.5.1.

Моим первым шагом было создание проекта ASP.NET MVC на моем компьютере разработчика, ориентированного на .NET 4.5.2. Я использую VS 2013 и у меня установлен пакет разработчика 4.5.2. Я написал лишний код, используя методы, которые поддерживаются только в .NET 4.5.2:

public ActionResult Index()
{
    if (!Response.HeadersWritten)
        Response.AddOnSendingHeaders((c) => { c.Response.AddHeader("Foo", "Bar"); });

    return View();
}

Response.HeadersWritten и Response.AddOnSendingHeaders представлены только в версии .NET 4.5.2 System.Web.dll. Как и ожидалось, это отлично компилируется локально.

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

Эталонные сборки для фреймворка ".NETFramework,Version=v4.5.2" не найдены. Чтобы решить эту проблему, установите пакет SDK или Targeting Pack для этой версии фреймворка или перенастройте приложение на версию фреймворка. для которых у вас установлен пакет SDK или Targeting Pack. Обратите внимание, что сборки будут разрешены из глобального кэша сборок (GAC) и будут использоваться вместо эталонных сборок. Поэтому ваша сборка может быть неправильно ориентирована на предполагаемую вами структуру.

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

Как компилируется этот код 4.5.2! Нет никаких локальных ссылок на System.Web, зарегистрированных в создаваемом источнике, и ничего не загружается через пакет nuget или что-то подобное.


person Pero P.    schedule 13.07.2015    source источник
comment
Указываете ли вы в своей конфигурации, что 4.5.2 должен быть целью платформы? Если это так, ослабьте это ограничение. Если нет, то я не понимаю, почему вы получите эту ошибку.   -  person Eric J.    schedule 14.07.2015


Ответы (2)


Я отследил это до версии System.Web.dll в GAC, на которую ссылаются во время сборки. Несмотря на всю документацию, в которой говорится, что Response.HeadersWritten и Response.AddOnSendingHeaders представлены только в .NET 4.5.2, следующее обновление безопасности для .NET 4.5/4.5.1 установило в GAC версию System.Web.dll, которая включает эти методы:

https://support.microsoft.com/en-us/kb/2894854

Это объясняет, почему компиляция все еще успешна. При принудительной компиляции сборки для версии 4.5.1 с помощью переключателя /p:TargetFrameworkVersion=v4.5.1 msbuild ссылка System.Web.dll представляет собой более старую версию, извлеченную из следующего места, которая не включает эти методы и, следовательно, не может скомпилироваться должным образом:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Web.dll

person Pero P.    schedule 13.07.2015
comment
Это связано с тем, что версия 4.5.2 была обновлением на месте, поэтому версия 4.5.2 заменила все измененные библиотеки DLL версии 4.5.1 (например, System.Web.dll). См. hanselman.com/blog/ и weblog.west-wind.com/posts/ 2012/Mar/13/ для получения подробной информации. - person Nicholas Carey; 14.07.2015

Если ваше приложение не использует ничего, характерного для версии 4.5.2 (или устарело, или изменилось критическим образом), все должно быть в порядке.

Или, конечно, это может быть B^), что вы просто не столкнулись с конкретными путями выполнения, где все идет наперекосяк.

Кроме того, можно заметить, что 4.5.2 был на месте обновлением семейства 4.x, поэтому вы получаете одни и те же библиотеки DLL независимо от того, какую версию 4.x вы используете. .

person Nicholas Carey    schedule 13.07.2015
comment
Я использую два упомянутых метода, которые существуют только в 4.5.2. Если я заставлю сборку скомпилировать версию 4.5.1 с помощью переключателя /p:TargetFrameworkVersion=v4.5.1 msbuild, сборка не скомпилируется, как я ожидал. Я просто не понимаю, почему сборка завершается успешно без этого переключателя, учитывая, что 4.5.2 не установлен на сервере сборки, и появляется предупреждение о том, что эталонные сборки 4.5.2 не найдены. - person Pero P.; 14.07.2015