gpt4 book ai didi

.net-3.5 - TargetInvocationException : Microsoft. AGL.Common.MISC.HandleAr(PAL_ERROR ar)

转载 作者:行者123 更新时间:2023-12-03 12:52:50 25 4
gpt4 key购买 nike

在我的 .NET Compact Framework 3.5 项目(在 Windows Mobile 6 上运行)中加载资源时,我随机得到一个 TargetInvocationException。它们看起来类似于此堆栈跟踪:

FATAL 2012-11-13 14:17:00,657 [23768895] TargetInvocationException - mobileX.MIP.Post.Presentation.Program
System.Reflection.TargetInvocationException: TargetInvocationException ---> System.Exception: Exception
at Microsoft.AGL.Common.MISC.HandleAr(PAL_ERROR ar)
at System.Drawing.Bitmap._InitFromMemoryStream(MemoryStream mstream)
at System.Drawing.Bitmap..ctor(Stream stream)
at System.Reflection.RuntimeConstructorInfo.InternalInvoke(RuntimeConstructorInfo rtci, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
at System.Resources.ResourceReader.CreateResource(Type objType, Type[] ctorParamTypes, Object[] ctorParameters)
at System.Resources.ResourceReader.LoadBitmap(Int32 typeIndex)
at System.Resources.ResourceReader.LoadObjectV2(Int32 pos, ResourceTypeCode& typeCode)
at System.Resources.ResourceReader.LoadObject(Int32 pos, ResourceTypeCode& typeCode)
at System.Resources.RuntimeResourceSet.GetObject(String key, Boolean ignoreCase)
at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture)

我猜测这个异常的原因是有一些我忘记清理的非托管资源。但是,我在项目中有很多表格和资源。

所以这里是我的问题:
  • 未清理的表单或资源是否可能是此异常的原因?
  • 如何追踪浪费我内存的确切表单或资源?

  • 关于 2:我已经使用 .NET Compact Framework Power Toys 3.5 中的 CLR Profiler 分析了我的应用程序。大量内存转到“原生功能”/ System.Windows.Forms.Control::_InternalWnProc Microsoft.AGL.Common.PAL_ERROR (Microsoft.AGL.Forms.WM int32 int32) .但是,我看不到这些资源的使用位置。我怎样才能知道?

    最佳答案

  • 我希望(甚至不要试图声称强力玩具分析器会帮助你)

  • 你将不得不审查你的代码。确保在所有 Disposable 对象上调用 Dispose,包括所有 GDI 对象、位图、画笔。

    其次,如果你曾经调用过 Font.ToHFont,这个调用是非常危险的,因为它需要你 p/invoke DeleteObject 在它之后进行清理。 (托管调用需要 p/invoke 才能不泄漏资源)

    我唯一的建议是,出于某种原因,大部分时间我的 AGL 错误都发生在靠近问题根源的地方。具体原因记不清了。在工作中,我们称之为无证的“加速悲伤层 (AGL)”

    最后,我还有一个更尖锐的问题要提出。您是否一次分配大量位图,然后释放它们,最后尝试创建托管内存对象,也许是缓冲区? Windows Mobile 6 是基于 Windows CE 5.0 而不是 Windows CE 6.0 构建的。因此,每个进程的内存限制为 32 MB。如果您一次分配大量位图,它们会增加非托管堆的大小。当您处理位图时,会调用 LocalFree 并且堆取消提交,但不会释放内存,.NET 将永远不会再看到它。除了避免一次分配大量位图之外,避免这种情况的唯一方法是分配大于或等于 96 KB 的位图,以保留堆外的页面。

    可能怀疑这是您的问题,但我会提到它,因为几乎不可能追查到。但是,我认为在这种情况下您最终会崩溃或出现 OutOfMemoryException。

    无论如何,我会考虑确保您没有泄漏资源或句柄,并仔细检查您的流格式是否正确。

    关于.net-3.5 - TargetInvocationException : Microsoft. AGL.Common.MISC.HandleAr(PAL_ERROR ar),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13495581/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com