在 WindowsCE 平台(自定义构建)上,我们的 C# gui 使用常规形式来显示“弹出菜单”。 我们将 FormBorderstyle 设置为 None 因为我们不希望表单控件可见。
一些客户在一段时间后报告“灰盒”。 在此处进行一些测试后,我们可以非常快速地重现该问题。当我们不断打开 2 个不同的菜单(表单)时,平台会向我们显示 native 异常。
Error
A native exception has occurred in Tiger.CEHost.exe. Select Quit and then restart this program, or select Details for more information.
详情:
Error
ExceptionCode: 0xC0000005
ExceptionAdress: 0x00000001
Reading: 0x00000001at WL.SetSTyle(IntPtr hwnThis, UInt32 dwMask, UInt32 dwStyle)
at Form._SetBorderStyle(AGL_WINDOWSTYLE wstyVal, AGL_WINDOWSTYLE wstyMask)
at Form.set_FormBorderStyle(FormBorderStyle value)
at pDropDown.PopupForm.Show()
at pDropDown.Show()
at pButton.ShowHideDropDown()
at pButton.OnClick(EventArgs e)
at Control.WnProc(WM wm, Int32 wParam, Int32 lParam)
at Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
at EVL.EnterMainLoop(IntPtr hwnMain)
at Application.Run(Form fm)
at Program.Main(String[] args)
它似乎总是在 FormBorderStyle 属性上失败。我们已经尝试删除所有 pInvoke,因为可能某些内存已被覆盖,但这没有帮助。
我们还记录了对 Show 方法的每次调用,每次调用都是在 gui 线程中进行的,并且 Form 包含一个有效的句柄。
最佳答案
我从未见过这种情况,这让我倾向于认为它不太可能成为 CF 甚至您的应用程序中的问题。
您的设备是否有足够的内存来运行该应用程序?内存不足的情况应该会引发 OOM,但我已经看到它会做其他不太可预测的事情,所以它始终是首先要检查的事情。
如果内存不是问题,您确定这不是平台问题吗?请记住,由于操作系统的很大一部分是由 OEM 开发的,因此您不能排除操作系统存在问题的可能性。
我会尝试两件事:
同一个应用程序是否可以在其他一些硬件(甚至是模拟器)上正常运行而没有问题?如果它可以在其他硬件上运行,则严重暗示该平台是问题所在。
由于使用 C# 中的小型应用程序进行重现相当容易,因此我建议使用 C/C++ 构建一个执行相同功能项目的应用程序,以查看它是否运行或出现相同的问题。
关于c# - Form.FormBorderStyle native 异常访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4013890/