Можно ли запустить приложение .NET 4.5 на XP?

86

Во-первых, я прочитал следующее:

Итак, исходя из последнего пункта, я действительно думаю, что этого нет, но мне нужно было посмотреть, смогу ли я получить окончательный ответ, поскольку моя команда хотела бы перейти с .NET 4.0 на .NET 4.5. Однако мы должны поддерживать XP.

Нет ли возможности перейти на .NET 4.5, если мы хотим поддерживать XP?

Единственное, о чем я мог придумать, - это создать два отдельных решения, но тогда кодовые базы должны были бы расходиться, если бы мы использовали функции .NET 4.5.

Итак, я ищу какое-то удивительное обходное решение, которое я не смог найти, а другие, возможно, уже знают.

Джастин Пихони
источник
9
Нет, не можешь. Придерживайтесь 4.0, пока XP не умрет окончательно.
Федерико Берасатеги

Ответы:

188

Я не решаюсь публиковать этот ответ, это действительно технически возможно, но на практике это не работает так хорошо. Номера версий CLR и основных сборок платформы не были изменены в 4.5. Вы по-прежнему нацелены на v4.0.30319 среды CLR, а номера версий сборки платформы по-прежнему 4.0.0.0. Единственное, что отличает манифест сборки, когда вы смотрите на него с помощью дизассемблера, такого как ildasm.exe, - это наличие атрибута [TargetFramework], который говорит, что требуется версия 4.5, которую нужно изменить. На самом деле это не так просто, это генерируется компилятором.

Самая большая разница не так заметна, Microsoft внесла давно назревшие изменения в исполняемый заголовок сборок. Указывает, с какой версией Windows совместим исполняемый файл. XP принадлежит к предыдущему поколению Windows, начатому с Windows 2000. Их основной номер версии - 5. Vista была началом текущего поколения, основной версии номер 6.

Компиляторы .NET всегда указывали минимальный номер версии 4.00, это версия Windows NT и Windows 9x. В этом можно убедиться, запустив dumpbin.exe / headers в сборке. Пример вывода выглядит так:

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            ...
            4.00 operating system version
            0.00 image version
            4.00 subsystem version              // <=== here!!
               0 Win32 version
            ...

Новым в .NET 4.5 является то, что компиляторы меняют версию этой подсистемы на 6.00. Изменение, которое было просрочено в значительной степени потому, что Windows обращает внимание на это число, помимо проверки того, достаточно ли оно мало. Он также включает функции appcompat, поскольку предполагает, что программа была написана для работы в старых версиях Windows. Эти функции вызывают проблемы, особенно то, что Windows лжет о размере окна в Aero. Он перестает лгать о толстых границах окна Aero, когда видит, что программа была разработана для работы в версии Windows, в которой есть Aero.

Вы можете изменить этот номер версии и установить его обратно на 4,00, запустив Editbin.exe в своих сборках с параметром / subsystem. В этом ответе показан пример события после сборки.

Однако на этом хорошие новости заканчиваются; серьезная проблема заключается в том, что .NET 4.5 не очень совместим с .NET 4.0. Безусловно, самая большая проблема заключается в перемещении классов из одной сборки в другую. В частности, это произошло с атрибутом [Extension]. Ранее в System.Core.dll он был перемещен в Mscorlib.dll в .NET 4.5. Это глупо для XP, если вы объявляете свои собственные методы расширения, ваша программа говорит искать в Mscorlib атрибут, включенный атрибутом [TypeForwardedTo] в версии .NET 4.5 эталонной сборки System.Core. Но его нет, когда вы запускаете свою программу на .NET 4.0.

И, конечно же, нет ничего, что помогло бы вам перестать использовать классы и методы, доступные только в .NET 4.5. Когда вы это сделаете, ваша программа выйдет из строя с исключением TypeLoadException или MissingMethodException при запуске на 4.0.

Просто поставьте цель 4.0, и все эти проблемы исчезнут. Или сломайте этот тупик и прекратите поддерживать XP - бизнес-решение, которое программисты не могут часто принимать, но, безусловно, могут поддержать, указав на проблемы, которые оно вызывает. Конечно, необходимость поддержки старых операционных систем требует ненулевых затрат, просто усилия по тестированию значительны. Стоимость, которую руководство не часто осознает, совместимость с Windows является легендарной, если им на это не указывают. Пересылайте эту стоимость клиенту, и он принимает правильное решение намного быстрее :) Но мы не можем вам с этим помочь.

Ганс Пассан
источник
2
Спасибо, Ганс, я понял, что произошли критические изменения. Я тоже ценю обходной путь. Мы не можем согласиться с этим по причинам, которые вы указали, но это полезно знать. Может быть, когда-нибудь XP уйдет навсегда ....
Джастин Пихони 06
3
just the testing effort is substantial- вот что заставило наше руководство «разрешить отказаться от поддержки XP».
Кристоф Финк
Я знаю, что это старый пост, но - @JustinPihony: Думала ли ваша компания когда-нибудь об установке более поздней ОС, а затем установке VMWare или Virtual Box? Это немного поздно для Windows 7, но Microsoft предоставила виртуальную установку Windows XP, которая позволила вам переключаться между 7 и XP. Просто мысль. :-)
Марк Мэннинг
@MarkManning это не было в нашей власти. Его использовали где-то еще.
Justin Pihony
1
@JustinPihony: А. Хммммм ... Мое единственное другое предложение - это клудж. Захватите версию ОС, а затем просто настройте все функции в ваших классах, которые будут помещены в массивы (или массив). Один массив (или часть массива) должен быть для XP, а другой - для более новых ОС. Тогда все, что вам нужно, это какая-то глобальная переменная, которая используется для обозначения того, какой набор использовать. Все вызовы могут быть одинаковыми (или выглядеть одинаково), но один набор использует NET40_ <FUNCTION>, а другие могут использовать NET45_ <FUNCTION>. Это был бы косвенный вызов самой функции. Имеет ли это смысл?
Марк Мэннинг
21

К сожалению, нет, вы не можете запускать программы 4.5 на XP.

И соответствующий пост со страницы подключения:

Написал Microsoft 23.03.2012, 10:39
Спасибо за отчет. Такое поведение разработано в .NET Framework 4.5 Beta. Минимальные поддерживаемые операционные системы: Windows 7, Windows Server 2008 SP2 и Windows Server 2008 R2 SP1. Windows XP не поддерживается в бета-версии.

Озтако - Восстановить Монику К.
источник
8

Проект Mono отказался от поддержки Windows XP и «забыл» упомянуть об этом. Хотя они по-прежнему заявляют, что Windows XP SP2 является минимальной поддерживаемой версией, на самом деле это Windows Vista.

Последней версией Mono, поддерживающей Windows XP, была версия 3.2.3.

гость
источник
7

Попробуйте моно:

http://www.go-mono.com/mono-downloads/download.html

Эта загрузка работает со всеми версиями Windows XP, 2003, Vista и Windows 7.

luiseduardohd
источник
2
Mono работает медленнее, чем .NET, и хотя в нем есть большинство функций .NET 4.5, ему не хватает некоторых основных компонентов, таких как WPF ( mono-project.com/Compatibility ). Таким образом, вы можете использовать Mono для поддержки XP, если он предоставляет все, что вам нужно, и вас устраивают последствия для производительности. С другой стороны, не должно быть необходимости создавать специальную «сборку Mono», обычная сборка .NET 4.5 обычно работает под Mono, но вам нужно протестировать ее специально, чтобы убедиться, что вы совместимы.
Qwertie
2
Я пробовал mono-3.12.1-gtksharp-2.12.26-win32-0.msi под Windows XP SP3, и это не удалось: «mono.exe не является допустимым приложением Win32» . Я также пробовал mono-3.0.10-gtksharp-2.12.11-win32-0.exe, который не удался с «mono.exe - точка входа не найдена. Точка входа процедуры InterlockedCompareExchange64 не может быть расположена в библиотеке динамической компоновки KERNEL32. .dll " .
Cristian Ciupitu