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,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描述了我的应用程序.大量内存转到“NATIVE FUNCTION”/ System.Windows.Forms.Control :: _ InternalWnProc Microsoft.AGL.Common.PAL_ERROR(Microsoft.AGL.Forms.WM int32 int32).但是,我无法看到这些资源的使用位置.我该怎么知道?
解决方法
>我希望(甚至不要声称电动玩具探测器会帮助你)
您将不得不检查您的代码.确保在所有Disposable对象上调用Dispose,包括所有GDI对象,位图,画笔.
其次,如果你曾经调用过Font.ToHFont,这个调用非常危险,因为它需要你调用/调用DeleteObject来清理它. (托管调用需要p / invoke才能泄漏资源)
我唯一的建议是,出于某种原因,大多数时候我的AGL错误发生在问题的根源附近.我不记得具体的原因.在工作中,我们称之为无证件的“加速悲伤层(AGL)”
最后,我还有一个更有针对性的问题.您是一次分配大量位图,然后释放它们,最后尝试创建托管内存对象,也许是缓冲区? Windows Mobile 6是基于Windows CE 5.0而不是Windows CE 6.0构建的.因此,每个进程的内存限制为32 MB.如果一次分配大量位图,它们会增加非托管堆的大小.当你处理位图时,会调用LocalFree并且堆decommit’s但不释放内存,.NET将永远不会再看到它.除了避免一次分配大量位图之外,避免这种情况的唯一方法是分配大于或等于96 KB的位图,该位图保留堆外的页面.
可能怀疑这是你的问题,但我会提到它,因为它几乎不可能追查.但是,我想你最终会遇到崩溃或OutOfMemoryException.
无论如何,我会考虑确保您没有泄漏资源或句柄,并仔细检查您的流是否格式正确.