Нацеливание на .NET 4.0 дает недопустимое приложение Win XP после обновления TFS .NET 4.5

У нас есть сервер сборки TFS (кажется, он называется контроллером сборки в терминологии TFS). Он создает и развертывает несколько решений. Одно из этих решений, проект Windows Forms, ориентированный на полный профиль .NET 4 и x86, раньше нормально работал в Windows XP, а теперь не запускается с сообщением:

*.exe не является допустимым приложением win32 в Windows XP

У нас есть сборка трехмесячной давности, которая отлично работает, и с тех пор в исходном коде ничего не изменилось. Но при запросе новой сборки с сервера сборки сейчас полученный .exe (с большим количеством .dll для его поддержки) не может быть запущен в 32-разрядной версии Windows XP. Эта же сборка отлично работает на 32-битной и 64-битной Windows 7.

Я думаю, что что-то, установленное на сервере сборки за последние три месяца, имеет значение. Было установлено много всего, включая .NET 4.5, Visual Studio 2012 и т. д. Тем не менее, это не должно изменить решение, ориентированное на 4.0.

Любые идеи?


person pinkfloydhomer    schedule 03.05.2013    source источник
comment
Как вопрос о серверах сборки, C# и .NET не по теме в Stack Overflow? Люди, проголосовавшие за закрытие, видимо, читают только заголовки вопросов, а не содержание...   -  person Daniel A.A. Pelsmaeker    schedule 03.05.2013
comment
Что ж, что бы вы ни думали, Ганс Пассант, проблема вполне воспроизводима. Если мы установим .NET 4.5 на сервере сборки (или на наших машинах для разработки), полученный .exe не будет работать в Windows XP. Несмотря на то, что решение нацелено на .NET 4, а не на 4.5. А если мы удалим .NET 4.5, то получившийся .exe будет работать на Windows XP. Чисто и просто.   -  person pinkfloydhomer    schedule 06.05.2013
comment
Я из команды Microsoft .NET Framework. Поддерживается создание приложений .NET4 с использованием набора инструментов .NET4.5. Я только что встретил крупную компанию, которая этим занимается. Можете ли вы прислать мне репродукционный проект, который воспроизводит проблему? Отправьте на netfx45compat в Microsoft dot com. Спасибо, Варун Гупта, команда .NET Framework.   -  person Varun    schedule 11.05.2013


Ответы (5)


.net 4.5 обновляет .net 4.0, поэтому, если на вашем сервере сборки установлен .net 4.5, и вы ориентируетесь на .net 4.0, это не тот же .net 4.0, который вы установили на XP. Вы не можете установить .net 4.5 на XP. Этот блог содержит более подробную информацию.

По сути, если вы хотите поддерживать XP, вы не можете использовать .net 4.5/Visual Studio 2012 (или установить их на своих сборочных машинах).

person James Reed    schedule 03.05.2013

Был старый горячий тема на форуме MSDN о том, что .NET 4.0 на машине с установленным .NET 4.5 отличается от .NET 4.0 с установленным .NET 4.5 Другими словами, нельзя надежно разрабатывать и тестировать приложения .NET 4.0 на/с машины с установленным .NET 4.5. NET 4.5 и должен монтировать отдельные машины/среды для разработки и тестирования.

Хотя в SO есть много ответов, настаивающих на обратном. Вероятно, от тех же авторов, которые отрицают любой мой ответ, противоречащий ему, например, здесь, здесь, здесь

person Gennady Vanin Геннадий Вани&    schedule 03.05.2013

Вероятно, это уже слишком поздно, чтобы иметь значение для OP, но я столкнулся с этой проблемой и нашел исправление, которое сработало для меня. Сборка моего проекта создает файл .exe.config в выходной папке. Эта конфигурация имеет раздел запуска с:

supportedRuntime version="v.4.0" sku=".NETFramework,Version=v4.5"

Я изменил 4.5 на 4.0, и теперь мои проекты работают на XP (Service Pack 2) без проблем. Все пакеты и dll, на которые я ссылаюсь, созданы для версии 4.0. Я не изучал его, чтобы выяснить, какой из них был виновником здесь, но я подозреваю, что это Microsoft.Practices.Unity, поскольку файл конфигурации, похоже, связан с внедрением зависимостей, которое я делаю. На основе Win7 с Visual Studio 2013 Update 4.

person Chuck    schedule 10.06.2015

Попробуйте изменить Platform ToolSet для использования Visual Studio 2010. Затем перестройте, надеюсь, это сработает для вас.

person JayH    schedule 03.05.2013
comment
Эта страница, похоже, предназначена для C++. Я не могу найти настройки набора инструментов платформы в нашем проекте C#. - person pinkfloydhomer; 03.05.2013

Компиляторы, включенные в .NET 4.5, используют скрытое знание, .NET 4.5 не поддерживается для XP. Это позволяет им делать то, что давно назрело для программ .NET, они могут, наконец, изменить целевую версию операционной системы. Который закодирован в заголовке EXE и DLL, он всегда был установлен на версию Windows 4.00 с момента первого выпуска .NET.

Вы можете увидеть этот целевой номер версии с помощью инструментов SDK, команда Dumpbin.exe /headers отображает его. Утилита Editbin.exe может изменить его после сборки с помощью параметра /SUBSYSTEM. Это был бы один из способов исправить ваши программы, чтобы они работали на XP.

Windows обращает внимание на это поле в EXE. Когда он увидит целевую версию менее, чем 6.00, он будет считать, что программа изначально была написана для работы в более старых версиях Windows, до Vista. Что затем включает несколько функций appcompat. Самый радикальный из них заключается в том, что он предполагает, что ваша программа ничего не знает о толстых границах окон, отображаемых при включенной функции Aero. Он будет лгать относительно размера окна, возвращая значение, которое на 6 пикселей меньше фактического размера окна. Эта ложь может сильно озадачить некоторых программистов, когда они пытаются делать такие вещи, как выравнивание окон.

Если для целевой версии установлено значение 6.00, Windows отключит такую ​​ложь. И останавливает запуск программы на XP, она не знает, что значит версия 6.00. Это только до 5.02, при условии, что установлен SP2.

Не нужно возвращаться к старой версии Visual Studio, ответ, который вы приняли, неверен. Обходной путь очень прост (на самом деле вы не хотите использовать Editbin.exe), просто выберите .NET 4.0 вместо 4.5. .NET 4.0 фактически доступен для XP. Компиляторы соответственно сохраняют целевую версию ОС на уровне 4.00. Если вы на 300 % уверены, что на самом деле уже ориентируетесь на .NET 4.0, значит, что-то не так в конфигурации сборочной машины. Что-то неприятное, например, использование ссылок на сборки из c:\windows\microsoft.net или GAC вместо c:\program files\reference сборок.

person Hans Passant    schedule 03.05.2013
comment
ОП говорит, что он уже нацелен на .NET 4.0 и всегда так делал. Только .NET был обновлен с 4.0 до 4.5. - person Daniel A.A. Pelsmaeker; 03.05.2013
comment
Ну, может быть, но это просто не так, как это работает. Что-то не так с этим сервером сборки или его предположениями, из вопроса не ясно, что это может быть. Я включил диагностику, чтобы увидеть, что на самом деле генерируют компиляторы, чтобы у него был дополнительный способ проверить, что делает сервер сборки. - person Hans Passant; 03.05.2013
comment
Проблема была решена путем удаления .NET 4.5 с сервера сборки. Даже если решение нацелено не на 4.5, а только на 4.0. Другими словами, установка .NET 4.5 разрушает .NET 4.0. Хорошая работа, Майкрософт. - person pinkfloydhomer; 03.05.2013
comment
Что ж, на этом всякая возможность выяснить, что не так с настройкой этого сервера, заканчивается. Когда-нибудь он вернется. Не уверен, почему вы думаете, что Microsoft сделала что-то неправильно, вам нужно смотреть в радиусе 50 футов, плюс-минус. - person Hans Passant; 03.05.2013
comment
@ХансПассант, "the answer you accepted is wrong about that...simply target .NET 4.0 instead of 4.5". При всем моем уважении к вам, я не могу спокойно относиться к таким ответам и настаивать на них. Мне не удается установить или запустить такое целевое приложение .NET 4.0 в моей Windows XP SP3 (с .NET 4.0) и получить ответы от службы поддержки, что проблемы на моей стороне, потому что их разработчики нацелены на .NET 4.0 из VS2012! - person Gennady Vanin Геннадий Вани&; 03.05.2013
comment
Ну, держи носки, не надо из-за этого заморачиваться. Я внимательно изучил влияние целевой версии .NET на заголовок EXE и задокументировал, как вы можете это сделать. Возможно, ваши версии VS2012 и .NET не совпадают, обновления приходят быстро и яростно. То, что я узнал, действительно для VS2012 Update 1, обновления, которое вернуло совместимость с XP в проектах C++. Это могло повлиять и на проекты .NET. Просто попробуйте. - person Hans Passant; 03.05.2013
comment
Что ж, что бы вы ни думали, Ганс Пассант, проблема вполне воспроизводима. Если мы установим .NET 4.5 на сервере сборки (или на наших машинах для разработки), полученный .exe не будет работать в Windows XP. Несмотря на то, что решение нацелено на .NET 4, а не на 4.5. А если мы удалим .NET 4.5, то получившийся .exe будет работать на Windows XP. Чисто и просто. - person pinkfloydhomer; 04.05.2013