2012-11-21 2 views
4

(Windows Mobile 6에서 실행되는) .NET Compact Framework 3.5 프로젝트에서 리소스를로드 할 때 임의로 TargetInvocationException이 발생합니다. 그들은이 스택 트레이스 유사 :이 예외의 이유TargetInvocationException : Microsoft.AGL.Common.MISC.HandleAr (PAL_ERROR ar)

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) 

내 생각 엔 내가 청소하는 것을 잊었다 일부 관리되지 않는 자원이 있다는 것입니다. 그러나 프로젝트에 많은 Forms와 Resources가 있습니다.

  1. 이 정리되지 않은 양식이나 자원이 예외에 대한 이유가 될 수 없습니다 :

    그래서 여기 내 질문입니까?

  2. 내 메모리를 낭비하는 정확한 양식이나 자원을 어떻게 추적 할 수 있습니까? 2에 관한

: 나는 이미 .NET Compact Framework에서 전원 완구 3.5에서 CLR 프로파일 내 응용 프로그램을 프로파일 링. 많은 메모리가 "기본 기능"/ System.Windows.Forms.Control::_InternalWnProc Microsoft.AGL.Common.PAL_ERROR (Microsoft.AGL.Forms.WM int32 int32)으로 이동합니다. 그러나 이러한 리소스가 사용되는 위치를 볼 수 없습니다. 어떻게 알 수 있습니까?

답변

3
  1. 네 소원 (심지어 전원 장난감 프로파일 러가 당신에게 도움이 될 것 항에 시도하지 말라) 당신은 당신의 코드를 검토해야 할 것

  • . 모든 GDI 개체, 비트 맵, 브러시를 포함하여 모든 Disposable 개체에서 Dispose를 호출해야합니다.

    둘째, Font.ToHFont를 호출하면이 호출은 DeleteObject를 호출하여 그 뒤에 정리해야하기 때문에 매우 위험합니다.

    내 유일한 조언은 대부분의 경우 내 AGL 오류가 문제의 원인과 유사하다는 것입니다. 나는 특별한 원인을 기억할 수 없다. 직장에서 우리는 이것을 문서화되지 않은 "AGL (Accelerated Grief Layer)"이라고 부릅니다.

    마지막으로, 나는 한 가지 더 지적해야 할 질문이 있습니다. 한 번에 많은 비트 맵을 할당 한 다음 해제하고 마침내 관리되는 메모리 개체 (아마도 버퍼)를 만들려고합니까? Windows Mobile 6은 Windows CE 5.0이 아니라 Windows CE 6.0이 아닙니다. 따라서 각 프로세스의 메모리는 32MB로 제한됩니다. 한 번에 많은 비트 맵을 할당하면 관리되지 않는 힙의 크기가 커집니다. 비트 맵을 처리 할 때 LocalFree가 호출되고 힙 디먼이 있지만 메모리를 해제하지는 않으며 .NET은 다시 비트 맵을 보지 않습니다. 한 번에 많은 비트 맵을 할당하는 것을 피하는 것 이외에이를 피하는 유일한 방법은 힙 외부에 페이지를 예약하는 96KB 이상의 비트 맵을 할당하는 것입니다.

    아마 당신의 문제는 의심 스럽지만, 나는 추적하기가 거의 불가능하기 때문에 그것을 언급 할 것입니다. 그러나 당신은 충돌이나 OutOfMemoryException으로 끝날 것이라고 생각합니다.

    어쨌든 리소스 또는 핸들이 누출되지 않았는지 확인하고 스트림이 올바른 형식인지 다시 확인하십시오.

  • +0

    감사합니다. 앨런. 응용 프로그램은 Windows Mobile 6에서 실행됩니다. 일부 양식에서는 Dispose()가 호출되지 않는 별자리가 있습니다. Form의 생성 된 코드의 일부인 구성 요소에서 Dispose()를 호출해야하는지 알고 있습니까?나는 생각하지 않는다. 그러나 단지 확신하고 싶어한다 ;-) – Bob

    +1

    어이, 모든 자식 컨트롤에 dispose를 호출하지 않고도 괜찮을 것이다.이 머신에는 반사경이 없다. 그러나 Form의 기본 구현은 모든 것을 처리한다고 생각한다. 자식 컨트롤. 내가했던 빠른 테스트. 하위 컨트롤은 Components 컬렉션에 유지되지 않고 ** 타이머와 같은 구성 요소 만이 거기에 보관됩니다. 필자가 보았던 한 가지 실수는 디자이너 파일에 && (components! = null) 처분 문을 기본으로 브러시에 명시적인 .Dispose 호출을 추가하는 것입니다. 컨트롤이없는 구성 요소가 없으면이 컬렉션이 null 일 때가 지 대부분 실행되지 않습니다. – Alan