在Windows的“兼容模式”下启动应用程序会如何影响该应用程序,以及如何检测到它?

Elm*_*lmo 6 .net c# vb.net windows

在兼容模式下运行时,Windows对应用程序有何作用?

有没有一种方法可以检测.NET中的兼容模式设置?

vcs*_*nes 6

在兼容模式下运行时,Windows对应用程序有何作用?

它插入了一些模拟旧行为或错误的兼容性垫片。有时这是必要的,某些程序的行为取决于已解决的旧错误;或者他们使用了未记录的功能。

Joel的博客文章Microsoft如何失去API战争就是一个很好的例子:

我最初是从热门游戏《模拟城市》的一位开发人员那里听说的,他告诉我他的应用程序中存在一个严重的错误:它在释放内存后立即使用了内存,这是一个主要的禁止措施,在DOS上可以正常使用,但是在Windows中无法正常工作,因为释放的内存可能会立即被另一个正在运行的应用程序抢占。Windows团队的测试人员正在研究各种流行的应用程序,对其进行测试以确保它们可以正常工作,但是SimCity一直崩溃。他们向Windows开发人员报告了此问题,他们分解了SimCity,在调试器中逐步进行了调试,发现了错误,并添加了特殊代码来检查SimCity是否正在运行,如果确实运行,则以特殊模式运行内存分配器。释放内存后仍然可以使用内存。

这就是兼容性垫片的作用。插入旧版行为。是否要报告其他版本的Windows;以不同的方式使特定的API行为;或禁用Windows的其他某些功能,这些功能可能会导致诸如Aero之类的问题。

垫片的技术细节在这里

Shim基础结构实现了一种形式的应用程序编程接口(API)挂钩。具体来说,它利用链接的性质将API调用从Windows本身重定向到替代代码(垫片本身)。Windows可移植可执行文件(PE)和公用对象文件格式(COFF)规范包括几个头,并且此头中的数据目录提供了应用程序和链接文件之间的间接层。通过导入地址表(IAT)进行对外部二进制文件的调用。

有没有一种方法可以检测.NET中的兼容模式设置?

问题是在兼容模式下运行的程序似乎提供了相关的答案。