如何使用 DISABLEUSERCALLBACKEXCEPTION 修复 Win7 应用程序兼容性垫片
Posted
技术标签:
【中文标题】如何使用 DISABLEUSERCALLBACKEXCEPTION 修复 Win7 应用程序兼容性垫片【英文标题】:How do i fix Win7 app compatibility shim with DISABLEUSERCALLBACKEXCEPTION 【发布时间】:2011-08-01 19:49:16 【问题描述】:我有一个非常大的 C# .NET4 WinForms 应用程序,已经投入生产超过 18 个月。我们终于在 Windows 7 上对其进行了测试(这个大公司还没有迁移)。该应用程序可以正常启动并运行,直到我们启动一个非常大的进程(从数据库中多次获取,并且绑定了许多表单和控件)。
当我们第一次在 Win7 上启动该进程时,系统崩溃了,Win7 在我们的*.vshost.exe
周围创建了一个应用兼容性垫片。当我查看注册表时
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
它显示vshost.exe
,其值为DISABLEUSERCALLBACKEXCEPTION
。
我搜索了一下,发现的很少。
有谁知道什么类型的代码会导致这种情况?我想修复代码以防止 shim。
【问题讨论】:
是崩溃造成的。不要修复垫片,修复崩溃。 这就是我的问题,什么类型的代码会导致我的应用程序崩溃(在 XP 中没有崩溃)到 Win7 需要创建 shim 的位置? 错误代码,当然。或者任何无视 UAC 限制的东西。如果您从未在 Vista 或 Win7 上运行过它,那很有可能。给每个人买一台新的开发机器,时间差不多。如果他们仍然停留在 2005 年或更低,则进行 VS 更新。 VS2008 及更高版本包含在程序中的清单也应避免使用 shim。 在网上搜索,当您的应用程序在 wndproc 内崩溃时,似乎添加了此 shim。 拉里说得对。防止这种情况发生的最简单方法是通过清单将自己标记为与 Win7 兼容(请阅读下面的答案以了解血腥细节) 【参考方案1】:仔细阅读这篇博文,我已经解释了整个事情:
http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/
短版
跨越用户-内核-用户边界的异常在 64 位 Windows 上丢失。
从 Windows 7 开始,当本机 64 位应用程序(即 64 位操作系统上的非 32 位应用程序)以这种方式崩溃时,程序兼容性助手会收到通知。如果应用程序没有 Windows 7 清单,它们会显示一个对话框,告诉您 PCA 已应用应用程序兼容性 shim。
下次运行应用程序时,Windows 将模拟 Server 2003 的行为并使异常消失。
为了保持这些异常(因为您希望它们发生),添加“我是为 Windows 7 设计的”清单条目:
<assembly>
<!-- We were designed and tested on Windows 7 -->
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="35138b9a-5d96-4fbd-8e2d-a2440225f93a"/>
<!--The ID below indicates application support for Windows Vista -->
<!--It's important to keep this too, since Vista has no idea about
Win7's supportedOS GUID -->
<supportedOS Id="e2011457-1546-43c5-a5fe-008deee3d3f0"/
</application>
</compatibility>
</assembly>
【讨论】:
以上是关于如何使用 DISABLEUSERCALLBACKEXCEPTION 修复 Win7 应用程序兼容性垫片的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?