Компиляторы, включенные в .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