Започвайки с 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>
В случай на елементите поддържана ОС операционната система знае предварително за коя операционна система сте проектирани. Това ще постави вашето приложение в контекста на Windows Vista, ако не кажете, че поддържате Windows 7:
(източник: msdn.com)
Това действие е подобно на стартиране на приложение в някакъв режим на съвместимост, напр.:
- Windows Server 2008 (сервизен пакет 1)
- Windows Vista (Service Pack 2)
- Windows Vista (сервизен пакет 1)
- Windows Vista
- Windows Server 2003 (сервизен пакет 1)
- Windows XP (сервизен пакет 2)
- Windows 2000
- Windows NT 4.0 (Service Pack 5)
- Windows 98 / Windows Me
- Windows 95
където ще получите schmorgasboard от приложени подложки за съвместимост и Windows ще емулира старо недокументирано поведение, за да помогне на приложението ви да се срине, когато зависи от това недокументирано поведение.
пример за подложки за съвместимост, които Windows 7 ще предостави за приложение, работещо в контекста на Windows Vista:
- RPC ще използва стария частен пул от нишки, а не пул от нишки на OS
- ще можете да заключите основния буфер за дисплей на работния плот за видео
- ще можете да бледите към основния видео буфер на работния плот, без да посочвате прозорец за изрязване
- ще бъдете уязвими към състояние на състезание GetOverlappedResult (ако сте зависили от него)
- ще продължите да получавате смекчаване на асистента за съвместимост на програмата (PCA).
И още веднъж, за да тествам приложението си правилно под Windows 7, трябва да добавя записа в манифеста supportsOS. Но, отново, няма да изпратя приложението с този флаг, защото не искам да загубя предимствата на тези подложки (напр. PCA). И отново, ако дадено приложение има проблеми, които са коригирани, защото е работило в контекста на Vista: никога няма да науча за това от нашите клиенти - защото приложението просто работи.
мисли? Насоки? Най-добри практики?