当我在其他计算机上部署我的应用程序时,会出现此错误:
现在,如果我卸载我的应用并重新安装它,则不会出现错误消息。有人遇到过这种情况么?我也无法理解堆栈跟踪。
答案 0 :(得分:2)
此类问题通常属于以下类型:
并非所有组件都已安装:确保所有第三方组件和其他先决条件都包含在您的设置中并正确设置。这包括COM对象,运行时库等。
配置差异:确保在设置中包含所有相关配置。
32位与64位问题:如果您的代码依赖于本机32位库/ COM组件,则需要将平台目标设置为x86进行编译
平台不支持的功能(对于纯.NET应用程序通常不是这种情况,旧操作系统的问题通常不是这样)
提升问题(在您的情况下,您似乎更不可能在XP上)
我的感觉告诉我您可能使用某些第三方控件在您的应用程序中显示报告。您确定这些控件是否已安装在目标计算机上?
答案 1 :(得分:2)
诊断表明本机CreateWindowEx()API函数失败。它失败的原因很少,最常见的是窗口窗口过程中的严重错误。对于Form类来说当然不是这种情况,我只见过Windows Forms程序因此错误而失败,因为该进程超出了其句柄配额。
要解释这将需要挥手。首先,默认情况下,Windows进程只允许创建10,000个句柄,GDI对象和user32对象。当然,你的程序在启动时不太可能消耗那么多。然而,当安装程序启动它时会发生这种情况。 Msi.exe获得特殊配置,允许创建更多句柄。我已经看到它这样做了,VS2008 Service Pack 1安装程序我在一个旧的未修补版本的XP上运行,在我开始它之后大约2个小时获得了多达500,000个句柄,然后它决定需要重新启动才能完成安装。
您的安装程序将使用CreateProcess()来启动该程序。它有一个名为bInheritHandles的参数,用于确定子进程是否继承父进程的句柄。因此,可能的情况是安装程序使用许多句柄,并且它将bInheritHandles参数设置为TRUE。然后,您的WF程序将以其超出的句柄配额开始,创建另一个句柄将失败。 SetVisibleCore()方法确实是创建主窗体的Handle属性的方法。
这当然是猜想,当进程显示异常对话框时,你应该可以使用Taskmgr.exe,Process选项卡自己看到这个。使用View + Select Columns并勾选Handles,GDI Object和USER对象。最终修复需要找出安装程序消耗这么多句柄的原因。或者使用不同的方式启动程序。