从 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。
但归根结底,我不会将应用程序发布给客户,表现为Invoker。如果我确实错过了什么,我不希望用户受到影响。我希望微软的操作系统来修正我的错误。此解决方案的问题是:
- 我必须在发布前修改 manfiest
- 我永远不会知道我错过的东西,因为它们只是在 Windows Vista 上工作。
类似的难题出现在Windows 7 的supportedOS清单中。您可以将清单添加到应用程序,指示您设计和测试的 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 7,这会将您的应用程序置于 Windows Vista 的上下文中:
(来源:msdn.com)
此操作类似于在某些兼容模式下运行应用程序,例如:
- Windows Server 2008(服务包 1)
- Windows Vista(服务包 2)
- Windows Vista(服务包 1)
- 视窗
- Windows Server 2003(服务包 1)
- Windows XP(服务包 2)
- 视窗 2000
- Windows NT 4.0(服务包 5)
- 视窗 98 / 视窗我
- 视窗 95
您将在其中应用兼容 shims 的 schmorgasboard,Windows 将模拟旧的未记录行为,以帮助您的应用程序在依赖于该未记录行为时崩溃。
Windows 7 将为在Windows Vista上下文中运行的应用程序提供的兼容性填充程序示例:
- RPC 将使用旧的私有线程池,而不是 OS 线程池
- 您将能够锁定主视频桌面显示缓冲区
- 您将能够在不指定剪辑窗口的情况下Blit到主桌面视频缓冲区
- 您将容易受到 GetOverlappedResult 竞争条件的影响(如果您依赖它)
- 您将继续获得程序兼容性助手 (PCA) 缓解
再一次,为了在Windows 7下正确测试我的应用程序,我必须添加supportOS清单条目。但是,再一次,我不会用那个标志来发布应用程序,因为我不想失去这些 shims 的好处(例如 PCA)。再说一次,如果某个应用程序由于在Vista环境中运行而出现了已修复的问题:我永远不会从我们的客户那里知道这件事——因为该应用程序正在运行。
想法?指导?最佳实践?