Начиная с Windows Vista, Microsoft добавила класс прокладок совместимости, которые позволяют приложению, которое предполагает, что оно имеет административный доступ к файлам и реестру, продолжать работу. функция.
Другими словами: приложение, вызвавшее сбой в Windows XP, будет работать в Windows Vista.
Эти исправления ошибок, предоставленные ОС, можно отключить, добавив раздел в манифест приложения, объявив, что приложение должно работать asInvoker
:
<!-- Disable Windows Vista standard user compatability heuristics -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker"/>
</requestedPrivileges>
</security>
</trustInfo>
В идеале разработчик должен протестировать свое приложение, чтобы убедиться, что оно не требует (без нужды) административных привилегий. Чтобы проверить это, мне нужно было бы манифестировать его как Invoker.
Но когда дело доходит до дела, я не собираюсь выпускать приложение для клиента, представленного asInvoker. Если я что-то пропустил, я не хочу, чтобы это повлияло на пользователя. я хочу, чтобы операционная система Microsoft исправила мои ошибки. Проблема с этим решением:
- я должен изменить manfiest перед выпуском
- я никогда не узнаю о вещах, которые пропустил, потому что они просто работают в Windows Vista.
Аналогичная головоломка возникает с поддерживаемой ОС Windows 7< /strong> манифестировать целиком. Вы можете добавить в приложение манифест, указывающий, для какой версии Windows вы были разработаны и протестированы:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
В случае элементов supportedOS операционная система заранее знает, для какой ОС вы были разработаны. Это поместит ваше приложение в контекст Windows Vista, если вы не укажете, что поддерживаете Windows 7:
(источник: msdn.com)
Это действие аналогично запуску приложения в каком-либо режиме совместимости, например:
- Windows Server 2008 (пакет обновления 1)
- Windows Vista (пакет обновления 2)
- Windows Vista (пакет обновления 1)
- Виндоус виста
- Windows Server 2003 (пакет обновления 1)
- Windows XP (пакет обновлений 2)
- Windows 2000
- Windows NT 4.0 (пакет обновления 5)
- Windows 98/Windows Me
- Windows 95
где вы получите набор прокладок совместимости, а Windows будет эмулировать старое недокументированное поведение, чтобы помочь вашему приложению избежать сбоя, когда оно зависело от этого недокументированного поведения.
пример прокладок совместимости, которые предоставляет Windows 7 для приложения, работающего в контексте Windows Vista:
- RPC будет использовать старый частный пул потоков, а не пул потоков ОС.
- вы сможете заблокировать основной видеобуфер рабочего стола
- вы сможете Blit в основной видеобуфер рабочего стола без указания окна отсечения
- вы будете уязвимы для состояния гонки GetOverlappedResult (если вы от него зависели)
- вы по-прежнему будете получать меры по смягчению последствий Program Compatibilty Assistant (PCA)
И еще раз, чтобы правильно протестировать мое приложение в Windows 7, я должен добавить запись манифеста supportsOS. Но опять же, я не поставлю приложение с этим флагом, потому что не хочу терять преимущества этих прокладок (например, PCA). И, опять же, если в приложении есть проблемы, которые были исправлены, потому что оно работало в контексте Vista: я никогда не узнаю об этом от наших клиентов, потому что приложение просто работает.
Мысли? Руководство? Лучшие практики?