TargetInvocationException: Microsoft.AGL.Common.MISC.HandleAr(PAL_ERROR ar)
Bekomme ich eine TargetInvocationException zufällig beim laden von Ressourcen in meine .NET Compact Framework 3.5 Projekt (läuft auf Windows Mobile 6). Sie sehen ähnlich wie dieses stack-trace:
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)
Meine Vermutung für den Grund dieser Ausnahme ist, dass es eine nicht verwaltete Ressource, die ich vergessen habe zu reinigen. Allerdings habe ich eine Menge von Formen und Ressourcen in das Projekt.
So, hier sind meine Fragen:
- Könnte eine Form oder Ressource, die nicht bereinigt wurde, der Grund für diese Ausnahme?
- Wie kann ich trace die genaue Form oder Ressource, die verschwendet meine Erinnerung?
Bezug 2: ich habe bereits profilierte meine Anwendung mit dem CLR Profiler aus dem .NET Compact Framework Power Toys 3.5. Viel Speicher, geht auf "NATIVE FUNCTION" /System.Windows.Forms.Control::_InternalWnProc Microsoft.AGL.Common.PAL_ERROR (Microsoft.AGL.Forms.WM int32 int32)
. Aber, ich kann nicht sehen, wo diese Ressourcen eingesetzt werden. Wie finde ich das heraus?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie gehen zu müssen, überprüfen Sie Ihren code. Stellen Sie sicher, dass Sie den Aufruf von Dispose auf alle Einweg-Objekte einschließlich aller GDI-Objekte, bitmaps, Pinsel.
Zweitens, wenn Sie jemals rufen Sie Schriftart.ToHFont, dieser Aufruf ist extrem gefährlich, weil es erfordert, dass Sie p/invoke DeleteObject zu reinigen, nachdem Sie. (Einen verwalteten Anruf erfordert ein p/invoke, um nicht unnötig Ressourcen verbraucht)
Mein einziger Rat ist, dass aus irgendeinem Grund, die meisten der Zeit, mein AGL Fehler passieren in der Nähe der Quelle des Problems. Ich kann mich nicht erinnern, spezifische Ursachen. Bei der Arbeit, wir nennen das " undokumentierte "Beschleunigt Trauer Layer (AGL)"
Schließlich habe ich noch eine Spitzen Frage zu stellen. Sind Sie auf der Zuordnung einer Menge von bitmaps auf einmal, dann befreien Sie, und schließlich versuchen, erstellen von verwalteten Speicher-Objekten, vielleicht puffert? Windows Mobile 6 ist basierend auf Windows CE 5.0 und nicht Windows CE 6.0. Daher, jeder Prozess hat eine 32-MB-limit für den Speicher. Wenn Sie zuordnen, viele bitmaps auf einmal, Sie wachsen die Größe der nicht verwalteten heap. Wenn Sie über bitmaps, LocalFree genannt wird und die heap-decommit, aber nicht den Speicher freizugeben, und .NET werden nie wieder sehen. Der einzige Weg, um dies zu vermeiden, außer der Vermeidung der Zuweisung einer Menge von bitmaps auf einmal, reservieren ist von bitmaps, die größer sind als oder gleich 96 KB, die behält sich vor, Seiten, die außerhalb des heap.
Wohl zweifelhaft, dass ist Ihr problem, aber ich erwähne es, weil es fast unmöglich ist, auf die Spur. Ich glaube, Sie würde am Ende mit einem Unfall oder einer OutOfMemoryException in diesem Fall jedoch.
Jedenfalls würde ich schauen in die Herstellung sicher, dass Sie nicht lecken Ressourcen oder Griffe, und überprüfen Sie Ihre stream in das richtige format.