2013-04-26 22 views
8

Tôi đang chiến đấu với một NullReferenceException lạ mà dường như được kích hoạt từ hàm GetNameCore() của lớp ItemAutomationPeer.NullReferenceException từ PresentationFramework.dll

Chi tiết ngoại lệ bên dưới nhưng khía cạnh hấp dẫn thực sự là nó không xảy ra trên máy phát triển của tôi chạy Windows 7 hoặc các máy tính Windows 7 khác mà chúng tôi đã thử nghiệm. Nó chỉ xảy ra trên máy tính thử nghiệm Windows 8 Pro của tôi.

Ngoại lệ được ném rõ ràng khi cố chỉnh sửa ô trong điều khiển DataGrid WPF.

Tôi đã cố gắng theo dõi nó cả ngày mà không thành công. Tôi đã thử gỡ lỗi quá trình từ xa bằng cách sử dụng Visual Studio và bước qua mã nhưng không ai trong số mã người dùng dường như được kích hoạt ngoại lệ. Nó rõ ràng là được thực hiện bởi một chuỗi các sự kiện bên trong PresentationFramework.Dll và ngoại lệ chỉ phát tán thông qua AppDomain và cuối cùng là treo ứng dụng.

Nếu có ai có thể nghĩ ra bất cứ điều gì có thể gây ra điều này, hoặc một cách để khắc phục nó, nó sẽ thực sự hữu ích.

Exception Type:   System.NullReferenceException 
Exception Message: Object reference not set to an instance of an object. 
Method Information: System.String GetNameCore() 
Exception Source: PresentationFramework 

Stack Trace 
    at System.Windows.Automation.Peers.ItemAutomationPeer.GetNameCore() 
    at System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() 
    at System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() 
    at System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() 
    at System.Windows.ContextLayoutManager.fireAutomationEvents() 
    at System.Windows.ContextLayoutManager.UpdateLayout() 
    at System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg) 
    at System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork() 
    at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() 
    at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget) 
    at System.Windows.Media.MediaContext.AnimatedRenderMessageHandler(Object resizedCompositionTarget) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
    at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.ProcessQueue() 
    at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.Run() 
    at System.Windows.Application.RunDispatcher(Object ignore) 
    at System.Windows.Application.RunInternal(Window window) 
    at System.Windows.Application.Run(Window window) 
    at System.Windows.Application.Run() 
+0

khi bạn nói điều này xảy ra trên Windows 8 máy tính thử nghiệm, là ứng dụng được xây dựng trên cùng một máy hoặc trên một Windows-8 máy? hoặc nó được xây dựng trên W7 và chỉ được thực thi từ Windows-8?Hãy nghĩ rằng có khá một vài trận đấu sai giữa dll giữa 2 hệ điều hành và cần một số tài liệu tham khảo để được sao chép tại địa phương cho nó hoạt động trên Windows-8 khi được xây dựng từ một máy W7. Hãy thử xây dựng nó từ Windows-8 và xem nếu vấn đề vẫn còn tồn tại. Bạn có thể thấy một lỗi biên dịch hoặc lấy một số chi tiết bên trongException khi thực hiện để có thể chỉ ra dll nào gây ra sự không khớp (Cái gì giống như Aero với Aero2 và vân vân) – Viv

+0

đó là một ý tưởng thú vị. Tôi không có một máy Windows 8 với VS vì vậy tôi không thể kiểm tra giả thuyết đó ngay bây giờ .. tuy nhiên, bạn có thể được vào một cái gì đó liên quan đến khuôn khổ là hơi khác nhau. –

Trả lời

8

Sau rất nhiều back-và-ra với trình gỡ lỗi từ xa, và gần các tìm kiếm không kết quả online Tôi đã có thể theo dõi vấn đề này một vài miss-cư xử ItemAutomationPeer trường.

Khi tôi gặp sự cố này, tôi không có kiến ​​thức về Tự động hóa giao diện người dùng và cách được hỗ trợ trong khung công tác WPF. Trong thực tế, khi AutomationPeer đã cho tôi suy nghĩ về COM interop vì một lý do nào đó vì vậy tôi đã đuổi vấn đề sai trong một thời gian. Nếu bạn đang đọc điều này và không biết UI Automation có lẽ là gì bắt đầu herehere có thể cung cấp cho bạn một ý tưởng xa như những gì UI Automation có nghĩa là trong ngữ cảnh của WPF.

Trong trường hợp của tôi, lý do tại sao ứng dụng gặp sự cố trên máy thử nghiệm Windows 8 nhưng nó hoạt động tốt trên máy phát triển của tôi (và vô số máy tính khác mà nó đã triển khai) là Windows 8 máy có một số loại ứng dụng trợ năng UI (hoặc một số máy khách Tự động hóa giao diện người dùng khác) đang chạy. Ngay sau khi tôi bắt đầu ứng dụng Trình dẫn truyện trên máy phát triển Windows 7 của tôi, tôi đã có thể khiến ứng dụng gặp sự cố tương tự ..

Khi tôi đã hiểu vấn đề gốc, tôi vẫn không thể gỡ lỗi thêm để tìm hiểu chính xác điều khiển nào gây ra vấn đề nhưng đọc trực tuyến dường như chỉ theo hướng chung của các điều khiển tùy chỉnh và vì vậy tôi bắt đầu một quá trình loại bỏ để xác định các điều khiển WPF tùy chỉnh nào có lỗi. Tôi tìm thấy hai điều khiển tùy chỉnh - một trong đó mở rộng một DataGrid, và một điều khác mở rộng một ListBox.

Cuối cùng, giải pháp cho vấn đề trong trường hợp của tôi là tạo các lớp tùy chỉnh mở rộng lớp cơ sở ItemsControlAutomationPeer và cung cấp các lớp tự động trên mỗi điều khiển tùy chỉnh có vấn đề bằng cách ghi đè phương pháp OnCreateAutomationPeer.

protected override AutomationPeer OnCreateAutomationPeer() 
{ 
    return new ControlSpecificCustomAutomationPeer(this); 
} 

Trường hợp lớp ControlSpecificCustomAutomationPeer sức trông giống như thế này ít nhất:

public class ControlSpecificCustomAutomationPeer 
    : ItemsControlAutomationPeer 
{ 
    public ControlSpecificCustomAutomationPeer(ItemsControl owner) 
     : base(owner) 
    { 
    } 

    protected override string GetNameCore() 
    { 
     return "";       // return something meaningful here.. 
    } 

    protected override ItemAutomationPeer CreateItemAutomationPeer(object item) 
    { 
     return new CustomDummyItemAutomationPeer(item, this); 
    }    
} 

public class CustomDummyItemAutomationPeer 
    : System.Windows.Automation.Peers.ItemAutomationPeer 
{ 
    public CustomDummyItemAutomationPeer(object item, ItemsControlAutomationPeer itemsControlAutomationPeer) 
     : base(item, itemsControlAutomationPeer) 
    { 
    } 

    protected override string GetNameCore() 
    { 
     if (Item == null) 
      return "";    

     return Item.ToString() ?? ""; 
    } 

    protected override AutomationControlType GetAutomationControlTypeCore() 
    { 
     return System.Windows.Automation.Peers.AutomationControlType.Text; 
    } 

    protected override string GetClassNameCore() 
    { 
     return "Dummy"; 
    } 
} 
+0

Cảm ơn bạn, Đây là cuộc sống tiết kiệm! –

+0

@ NS.X. - Tôi cá là .. Tôi biết mình đã lãng phí thời gian đáng kể để theo đuổi điều này. –

+0

Đối với những gì nó có giá trị, chúng tôi đã có cùng một vấn đề nhưng chỉ khi các ứng dụng đang chạy trên Win8 HOẶC chúng tôi đã biến người kể chuyện trên trong Win7. Của chúng ta hóa ra là một sự tương tác khó khăn để gỡ rối giữa các bộ định vị thuộc tính khác nhau. Sau khi thuộc tính đã được thiết lập, một nơi nào đó trong mã đó chúng tôi đã thiết lập nó trở về null. Trước khi tôi chẩn đoán điều đó, tôi thấy rằng giải pháp trên 'cố định' các triệu chứng đồng đẳng tự động hóa. –

Các vấn đề liên quan