Чи можна запустити програму .NET 4.5 на XP?


86

По-перше, я прочитав наступне:

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

Чи немає можливості перейти на .NET 4.5, якщо ми хочемо підтримувати XP?

Єдине, про що я міг подумати, це створення двох окремих рішень, але тоді кодові бази повинні були б розходитися, якщо б ми використовували функції .NET 4.5.

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


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

Відповіді:


187

Я вагаюся розмістити цю відповідь, це насправді технічно можливо, але на практиці це не так добре працює. Номери версій 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 / заголовки на збірці. Зразок виводу виглядає так:

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. Це kaboom для XP, якщо ви заявите про власні методи розширення, ваша програма каже шукати в Mscorlib атрибут, увімкнений атрибутом [TypeForwardedTo] у версії .NET 4.5 довідкової збірки System.Core. Але його немає, коли ви запускаєте програму на .NET 4.0

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

Просто встановіть ціль 4.0 і всі ці проблеми зникнуть. Або зламати цю помилку і припинити підтримку XP - ділового рішення, яке програмісти не можуть часто прийняти, але, звичайно, можуть заохотити, вказавши на клопоти, які це спричиняє. Звичайно, необхідність підтримувати стародавні операційні системи не є нульовою вартістю, лише зусилля з тестування є значними. Сума сумісності Windows, яка часто не визнається керівництвом, є легендарною, якщо на це не вказано. Переадресуйте цю вартість клієнту, і вони, як правило, приймають правильне рішення набагато швидше :) Але ми не можемо вам у цьому допомогти.


2
Дякую, Ганс, я зрозумів, що відбулися певні зміни. Я також ціную цей обхідний шлях. Ми не можемо піти з ним із зазначених вами причин, але це добре знати. Можливо, колись XP піде назавжди ....
Джастін Піхоні

3
just the testing effort is substantial- ось що змусило наше керівництво "дозволити відмовитися від підтримки XP".
Крістоф Фінк,

Я знаю, що це старе повідомлення - але - @JustinPihony: Ваша компанія коли-небудь замислювалася встановити пізнішу ОС, а потім встановити VMWare або Virtual Box? Для Windows 7 трохи пізно - але Microsoft видала віртуальну інсталяцію Windows XP, яка дозволила вам перемикатися між 7 і XP. Просто думка. :-)
Марк Меннінг

@MarkManning це не було в нашому контролі. Його використовували деінде.
Джастін Піхоні,

1
@JustinPihony: Ах. Хм-м-м-м ...... Єдина моя інша пропозиція - клуб. Захопіть версію ОС, а потім просто налаштуйте всі функції у ваших класах, які будуть розміщені в масиви (або масив). Нехай один масив (або частина масиву) буде для XP, а інший - для новіших ОС. Тоді все, що вам потрібно, це якась глобальна змінна, яка використовується для позначення того, який набір використовувати. Всі дзвінки можуть бути однаковими (або виглядати однаково), але один набір використовує NET40_ <FUNCTION>, а інші можуть використовувати NET45_ <FUNCTION>. Це було б непрямим викликом самої функції. Чи має це сенс?
Марк Меннінг

21

На жаль, ні, ви не можете запускати 4,5 програми на XP.

І відповідна публікація на цій сторінці Connect:

Опубліковано 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.


2
Mono працює повільніше, ніж .NET, і хоча він має більшість функцій .NET 4.5, у ньому відсутні деякі основні компоненти, такі як WPF ( mono-project.com/Compatibility ). Тож ви можете використовувати підтримку Mono для XP, якщо вона надає все, що вам потрібно, і у вас все гаразд із наслідками продуктивності. Позитивним моментом може бути відсутність необхідності у створенні спеціальної "монобудови", звичайна .NET 4.5 збірка, як правило, працює в режимі Mono, але вам потрібно протестувати Mono спеціально, щоб переконатися, що ви сумісні.
Кверті

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 " .
Крістіан Джупіту

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.