Назад | Перейти на главную страницу

Можно ли использовать прокладки для изменения номера версии Windows?

У меня установщик, который жалуется на неправильные номера версий Windows, что не позволяет установить обновление приложения на Windows Server 2012:

Неподдерживаемая операционная система, major = 6, version = 2.2, sp = 0.0, type = 3

Можно ли использовать прокладка изменить type=3 в type=1 для установщика? Если да, то каковы будут ключевые шаги?

Согласно .exe свойства файла, установщик был сделан с dotNetInstaller. Я могу представить, что он получает номер версии, вызывая функцию API GetProductInfo (обновление: нет, это GetVersionEx). Я уже пробовал запускать установщик в различных режимах совместимости. К сожалению, это не влияет на указанные номера версий. Смотрите также мой вопрос на суперпользователя.

Я ошибся в своем первом ответе. Моим первым предложением было сделать прокладку "ложь версии" для вашего приложения. Но вы не можете, потому что вы используете приложение с управляемым кодом. Я не говорю, что вы не можете писать перехватчики API для приложений .NET, но поддержка совместимости приложений для управляемых приложений кажется гораздо более неоднородной.

Оболочки приложений реализуют перенаправления API, поэтому, когда приложение выполняет определенный вызов API, оно перехватывается или «захватывается», а некоторые другие данные возвращаются приложению из оболочки.

http://technet.microsoft.com/en-us/library/dd837644(v=WS.10).aspx

Инфраструктура Shim реализует форму подключения интерфейса прикладного программирования (API). В частности, он использует природу связывания для перенаправления вызовов API из самой Windows на альтернативный код - саму прокладку.

В большинстве случаев вы можете создавать свои собственные прокладки с помощью Application Compatibility Toolkit:

http://blogs.technet.com/b/askperf/archive/2011/06/17/demystifying-shims-or-using-the-app-compat-toolkit-to-make-your-old-stuff-work- с-ваш-новый-материал.aspx

И наиболее распространенный вариант использования совместимых приложений - это «ложь версии», когда оболочка указывает приложению, на какой версии оно работает.

Потому что разработчики настаивать при проверке версии в своем коде, что неверно. Microsoft говорит вам, что это неправильно. Не проверяйте версию своего кода. (Вместо этого проверьте наличие или отсутствие конкретной функции, которую вы собираетесь использовать.)

Но разработчики по-прежнему проверяют версию каждый день. Что еще хуже, они проверяют версию '==', когда приложение просто не будет работать, если вы не запустите точный версия Windows, что произвольно и глупо.

Вздох ... разработчики.

Крис Джексон из Microsoft много лет работал над совместимостью приложений, и его взгляды аналогичны:

Один из классов прокладок, который людям кажется наиболее простым для понимания, - это прокладки в исполнении. По сути, у нас есть прокладки, которые могут компенсировать тот факт, что многие клавиатуры разработчиков поставлялись с неисправной клавишей (а частота отказов этой клавиши на клавиатурах разработчиков просто поразительна). Они работают, просто возвращая другое значение из API GetVersion (Ex), в зависимости от того, какую операционную систему вы выбрали.

Но, к сожалению в той же статье, он дает нам то, что я считаю важной информацией здесь:

Итак, теперь, когда у вас запущен CompatAdmin, в системной базе данных разверните список исправлений совместимости. С переключателем / x вы заметите, что WinXPSP2VersionLie теперь имеет знак плюса - если вы его развернете, вы увидите список модулей, рядом с которыми есть красный ромб. Это модули, которые специально исключаются этой прокладкой. Среди этих? Модули .NET Framework.

Видите ли, .NET Framework не любит, когда ей лгут. Они проверяют версии, чтобы определить, как реализовать определенные вещи, и думать, что они работают на более низком уровне, не так уж и хорошо. Итак, мы намеренно исключаем эти модули, и, следовательно, мы намеренно исключаем код, который вы пишете, что эти модули JIT и выполняются. Не то чтобы мы этого хотели, но инфраструктура не давала нам отличного способа их отделить. Мы либо лгали всему, либо ничего не лгали. Врать было хуже, поэтому мы не стали.

Хе-хе, забавно, что .NET тоже проверяет версии, когда я только что сказал, насколько это плохая идея ...

Для реальных приложений, которым нужна ложь версии, ну, если приложение управляемое, вам придется изменить код. Это то, что вы не можете и не должны устранять.

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

Из MSDN:

Как правило, приложения не должны выполнять проверку версии операционной системы. Если приложению требуется определенная функция, предпочтительнее попытаться найти эту функцию и потерпеть неудачу, только если необходимая функция отсутствует.