2013-04-26 15 views
8

ItemAutomationPeerクラスのGetNameCore()機能から明らかに発生した奇妙なNullReferenceExceptionと戦っています。PresentationFramework.dllからのNullReferenceException

例外の詳細は以下のとおりですが、本当に興味深い点は、Windows 7を実行している開発マシンやテストした他のWindows 7コンピュータでは発生しないということです。私のWindows 8 Proテストマシンでのみ発生します。

WPF DataGridコントロールでセルを編集しようとすると、例外がスローされます。

私は一日中それを成功させることなく追跡しようとしてきました。 Visual Studioを使用してプロセスをリモートでデバッグしようとしましたが、コードをステップ実行しても例外はありません。これは明らかにPresentationFramework.Dll内の一連のイベントによって実行され、例外はAppDomainを突破し、最終的にアプリケーションをクラッシュさせます。

誰かがこれを引き起こしている可能性のあること、またはそれを修正する方法を考えることができれば、本当に助けになるでしょう。オンライン

リモートデバッガとの往復の多くの後
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

Windows-8マシンですか?またはそれはW7で構築され、Windows-8から実行されただけですか?2つのOS間でdllの間にかなりの不一致があったと思って、W7マシンからビルドされたWindows-8で動作するようにローカルでコピーするための参照が必要でした。 Windows-8からビルドし、問題が引き続き発生するかどうか確認してください。コンパイルエラーが表示されるか、完了したらinnerExceptionの詳細が表示され、どのDLLがAero2などのAeroのようなものかを示している可能性があります。 – Viv

+0

これは興味深い考えです。私はVSとのWindows 8のマシンを持っていないので、私は今仮説をテストすることはできません..しかし、あなたは少し異なっているフレームワークに関する何かになるかもしれません。 –

答えて

8

、ほぼ無益な検索私はミス行動ItemAutomationPeerインスタンスのカップルに問題を追跡することができました。

私がこの問題に遭遇したとき、UIオートメーションについての知識はなく、WPFフレームワークでどのようにサポートされているのですか?事実、AutomationPeerが何らかの理由でCOM interopを考えていたので、しばらく間違った問題を追いかけました。あなたがこれを読んでいて、UI Automationがおそらくherehereを開始しているかどうかわからないのであれば、WPFのコンテキストでUI Automationが何を意味するかを知ることができます。

私の場合、アプリケーションがWindows 8テストマシンでクラッシュしていたのは、開発マシン(およびそれに配備されていた無数の他のコンピュータ)でうまくいきました。 8マシンには、ある種のUIアクセシビリティアプリケーション(または他のUIオートメーションクライアント)が動作していました。 Windows 7の開発マシンでナレータアプリケーションを起動すると、アプリを同じようにクラッシュさせることができました。

私が根本的な問題を理解すると、これをさらにデバッグすることができませんでした正確にどのコントロールが問題を引き起こしていましたが、オンラインで読むことはカスタムコントロールの一般的な方向を指しているようでした。そこで、カスタムWPFコントロールが有罪であるかどうかを判断するために、取り除くプロセスを開始しました。 DataGridを拡張したものとListBoxを拡張したものの2つのカスタムコントロールが見つかりました。

最後に、ItemsControlAutomationPeer基底クラスを拡張するカスタムクラスを作成し、OnCreateAutomationPeerメソッドをオーバーライドして問題のあったカスタムコントロールのそれぞれをオートメーションピアとして提供することでした。 ControlSpecificCustomAutomationPeerクラスかもしれないが、非常に少なくとも、次のようになります

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

:あなたは、これがWindowsの-8テストマシン上で発生したと言ったときに、同じマシン上または上に構築されたアプリだった

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

ありがとう、これは救命です! –

+0

@ NS.X。 - 私は賭ける。私はこれを追いかけてかなりの時間を無駄にしたことを知っている。 –

+0

何が価値があるのか​​、私たちは同じ問題を抱えていましたが、アプリケーションがWin8で動作しているとき、またはWin7でナレータをオンにしたときだけです。私たちは、さまざまなプロパティ設定者の間でデバッグが難しいということが判明しました。プロパティが設定された後、そのコードのどこかでnullに戻していました。私がそれを診断する前に、私は上記の解決策が自動化ピア症状を「固定」していることを発見しました。 –

関連する問題