【发布时间】:2012-01-11 15:46:12
【问题描述】:
当应用程序在兼容模式下运行时,Windows 会对应用程序做什么?
有没有办法检测 .NET 中的兼容模式设置?
【问题讨论】:
当应用程序在兼容模式下运行时,Windows 会对应用程序做什么?
有没有办法检测 .NET 中的兼容模式设置?
【问题讨论】:
当应用程序在兼容模式下运行时,Windows 会对应用程序做什么?
它插入了几个模仿旧行为或错误的兼容性垫片。有时这是必要的,某些程序的行为取决于已修复的旧错误;或者他们使用了未记录的功能。
Joel 的博客文章 How Microsoft Lost the API War 给出了一个很好的例子:
我是从热门游戏 SimCity 的一位开发人员那里第一次听说这件事的,他告诉我他的应用程序中存在一个严重错误:它在释放内存后立即使用了内存,这是一个重大的禁忌,碰巧可以正常工作在 DOS 上,但在 Windows 下无法工作,在 Windows 下,释放的内存可能会立即被另一个正在运行的应用程序抢走。 Windows 团队的测试人员正在检查各种流行的应用程序,测试它们以确保它们运行良好,但 SimCity 不断崩溃。他们向 Windows 开发人员报告了这一点,他们反汇编了 SimCity,在调试器中逐步检查,发现了错误,并添加了特殊代码来检查 SimCity 是否正在运行,如果是,则以特殊模式运行内存分配器释放后仍然可以使用内存。
这就是兼容性垫片的作用。插入遗留行为。是否是报告不同版本的Windows;以不同的方式使某种 API 行为;或禁用可能导致 Aero 等问题的其他一些 Windows 功能。
垫片的技术细节是here。
Shim 基础架构实现了一种应用程序编程接口 (API) 挂钩形式。具体来说,它利用链接的性质将 API 调用从 Windows 本身重定向到替代代码 - 垫片本身。 Windows 可移植可执行文件 (PE) 和通用对象文件格式 (COFF) 规范包括多个标头,并且此标头中的数据目录提供了应用程序和链接文件之间的间接层。通过导入地址表 (IAT) 调用外部二进制文件。
有没有办法检测 .NET 中的兼容模式设置?
问题Is a Program Running in Compatibility Mode似乎给出了相关答案。
【讨论】: