2013-04-26 12 views
8

Walczę z dziwnym wyjątkiem NullReferenceException, który najwyraźniej został wywołany z funkcji GetNameCore() klasy ItemAutomationPeer.Wyjątek NullReferenceException od PresentationFramework.dll

Szczegóły wyjątku są poniżej, ale naprawdę intrygującym aspektem jest to, że nie występuje on na mojej maszynie programistycznej z systemem Windows 7 lub innymi komputerami z systemem Windows 7, z którymi testowaliśmy. Dzieje się tak tylko na moim komputerze testowym z systemem Windows 8 Pro.

Wyjątek jest generowany najwyraźniej podczas próby edycji komórki w formancie DataFrid WPF.

Próbowałem go wyśledzić przez cały dzień bez powodzenia. Próbowałem zdalnie debugowanie procesu przy użyciu programu Visual Studio i przechodzenie przez kod, ale żaden z kodów użytkownika nie uruchamia wyjątku. Jest to oczywiście wykonywane przez sekwencję zdarzeń wewnątrz PresentationFramework.Dll, a wyjątek po prostu przelewa się przez AppDomain i ostatecznie powoduje awarię aplikacji.

Jeśli ktokolwiek może wymyślić coś, co może być przyczyną tego lub sposób, aby to naprawić, to naprawdę pomoże.

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

kiedy mówisz to występuje na Windows 8 komputerze testowym był app zbudowany na tej samej maszynie lub na zasadzie Maszyna Windows-8? czy był zbudowany na W7 i właśnie wykonany z Windows-8?Sądzę, że było sporo nieporozumień między bibliotekami dll między 2 OS i potrzebowałem pewnych odwołań do skopiowania lokalnie, ponieważ działa on na Windows-8, gdy jest zbudowany z maszyny W7. Spróbuj zbudować go z Windows-8 i sprawdź, czy problem nadal występuje. Możesz zobaczyć błąd kompilacji lub uzyskać detale innerException po wykonaniu tej czynności, co może wskazywać, która biblioteka DLL powoduje niezgodność (coś podobnego do Aero wobec Aero2 i tak dalej). – Viv

+0

To interesujący pomysł. Nie mam komputera z Windows 8 z VS, więc nie mogę przetestować tej hipotezy już teraz. Jednak możesz być na czymś, co dotyczy nieco innych ram. –

Odpowiedz

8

Po wielu back-i-naprzód z pilota zdalnego debugera, a prawie bezowocne wyszukiwania w Internecie udało mi się wyśledzić problem do kilku Miss-zachowuje ItemAutomationPeer przypadkach.

Po napotkaniu tego problemu miałem zerową wiedzę na temat UI Automation i sposobu, w jaki jest obsługiwany w ramach WPF. W rzeczywistości, kiedy AutomationPeer kazał mi myśleć o współdziałaniu COM z jakiegoś powodu, przez jakiś czas ścigałem niewłaściwy problem. Jeśli to czytasz i nie wiesz, co to może być UI Automation, to here i here mogą dać ci pojęcie o tym, co oznacza UI Automation w kontekście WPF.

W moim przypadku okazało się, że przyczyną awarii aplikacji na maszynie testowej Windows 8 było to, że działała ona dobrze na moim komputerze programistycznym (i niezliczonych innych komputerach, na których była ona zainstalowana) było to, że system Windows Na 8 komputerach działała jakaś aplikacja ułatwiająca dostęp do interfejsu użytkownika (lub jakiś inny klient automatyzacji interfejsu użytkownika). Zaraz po uruchomieniu aplikacji Narrator na maszynie programistycznej systemu Windows 7 udało mi się przekonać aplikację do awarii.

Gdy zrozumiałem problem z rootem, nadal nie mogłem go dalej debugować, aby dowiedzieć się, dokładnie to, co kontrolowanie było przyczyną problemu, ale więcej czytania online wydawało się wskazywać na ogólny kierunek niestandardowych formantów i dlatego rozpocząłem proces eliminacji w celu ustalenia, które niestandardowe formanty WPF były winne. Znalazłem dwie niestandardowe formanty - jedną, która rozszerzyła DataGrid, i drugą, która rozszerzyła ListBox.

Wreszcie rozwiązanie problemu w moim przypadku było stworzenie niestandardowych klas, które rozszerzają klasę ItemsControlAutomationPeer bazową i przekazywania tych jako rówieśników automatyki na każdym z kontroli celnych, które miały problemy poprzez nadpisanie metody OnCreateAutomationPeer.

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

gdzie klasa potęga ControlSpecificCustomAutomationPeer wygląda tak przynajmniej:

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

Dziękuję, to jest ratowanie życia! –

+0

@ NS.X. - Założę się ... Wiem, że straciłem sporo czasu, ścigając to. –

+0

Co jest warte, mieliśmy ten sam problem, ale tylko wtedy, gdy aplikacja była uruchomiona na Win8 lub włączyliśmy Narratora w Win7. Nasza okazała się trudną do debugowania interakcją między różnymi ustawiaczami nieruchomości. Po ustawieniu właściwości, gdzieś w tym kodzie ustawiliśmy ją ponownie na wartość null. Zanim zdiagnozowałem to, stwierdziłem, że powyższe rozwiązanie "naprawiło" symptomatyczne symptomy peera. –

Powiązane problemy