2013-04-26 7 views
8

मैं एक अजीब NullReferenceException के साथ लड़ रहा हूं जिसे स्पष्ट रूप से GetNameCore()ItemAutomationPeer वर्ग के फ़ंक्शन से निकाल दिया गया है।प्रस्तुति Framework.dll से NullReferenceException

अपवाद का विवरण नीचे दिया गया है लेकिन वास्तव में दिलचस्प पहलू यह है कि यह मेरे विकास मशीन पर विंडोज 7 या अन्य विंडोज 7 कंप्यूटरों के साथ परीक्षण नहीं किया गया है जिनके साथ हमने परीक्षण किया है। यह केवल मेरे विंडोज 8 प्रो परीक्षण मशीन पर होता है।

WPF DataGrid नियंत्रण में किसी सेल को संपादित करने का प्रयास करते समय अपवाद को स्पष्ट रूप से फेंक दिया जाता है।

मैं सफलता के बिना पूरे दिन इसे ट्रैक करने की कोशिश कर रहा हूं। मैंने विजुअल स्टूडियो का उपयोग करके दूरस्थ रूप से प्रक्रिया को डीबग करने और कोड के माध्यम से कदम उठाने का प्रयास किया लेकिन उपयोगकर्ता कोड में से कोई भी अपवाद को ट्रिगर नहीं कर रहा है। यह स्पष्ट रूप से प्रेजेंटेशनफ्रेमवर्क के अंदर घटनाओं के अनुक्रम द्वारा निष्पादित किया गया है। डीएलएल और अपवाद केवल ऐपडोमेन के माध्यम से बुलबुले और अंततः एप्लिकेशन को दुर्घटनाग्रस्त कर देता है।

यदि कोई ऐसा कुछ भी सोच सकता है जो इसका कारण हो सकता है, या इसे ठीक करने का एक तरीका यह वास्तव में मदद करेगा।

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

जब आप कहते हैं इस विंडोज -8 परीक्षण मशीन पर होता है, एक ही मशीन पर या एक पर बनाया गया था एप्लिकेशन विंडोज -8 मशीन? या यह W7 पर बनाया गया था और बस विंडोज -8 से निष्पादित किया गया था?सोचें कि 2 ओएस के बीच डीएल के बीच कुछ गलत-मैचों थे और डब्ल्यू 7 मशीन से बने विंडोज -8 पर काम करने के लिए स्थानीय रूप से प्रतिलिपि बनाने के लिए कुछ संदर्भों की आवश्यकता थी। इसे विंडोज -8 से बनाने का प्रयास करें और देखें कि समस्या अभी भी बनी हुई है या नहीं। आप एक संकलन त्रुटि देख सकते हैं या कुछ आंतरिक अपवाद विवरण प्राप्त कर सकते हैं ताकि यह इंगित हो सके कि कौन सा डीएल मेल नहीं खा रहा है (एरो 2 के खिलाफ एरो की तरह कुछ और इतने पर) – Viv

+0

यह एक दिलचस्प विचार है। मेरे पास वीएस के साथ विंडोज 8 मशीन नहीं है इसलिए मैं उस परिकल्पना का परीक्षण नहीं कर सकता .. हालांकि, आप ढांचे के बारे में कुछ अलग हो सकते हैं। –

उत्तर

8

दूरस्थ डीबगर के साथ वापस और आगे का एक बहुत बाद, और लगभग निरर्थक खोज ऑनलाइन मैं मिस-व्यवहार कर ItemAutomationPeer उदाहरणों के एक जोड़े के लिए इस मुद्दे को ट्रैक करने में सक्षम था।

जब मैं इस मुद्दे में भाग गया तो मुझे UI ऑटोमेशन और WPF ढांचे में इसका समर्थन करने के बारे में शून्य ज्ञान नहीं था। वास्तव में, जब ऑटोमेशन पीयर मुझे किसी कारण से COM इंटरऑप के बारे में सोच रहा था तो मैंने थोड़ी देर के लिए गलत समस्या का पीछा किया। यदि आप इसे पढ़ रहे हैं और यह नहीं जानते कि यूआई ऑटोमेशन शायद here और here से शुरू हो रहा है तो आपको एक विचार दे सकता है कि यूपी ऑटोमेशन का मतलब WPF के संदर्भ में क्या है।

मेरे मामले में, यह पता चला है कि विंडोज 8 परीक्षण मशीन पर एप्लिकेशन क्यों क्रैश हो रहा था, फिर भी यह मेरी विकास मशीन (और अनगिनत अन्य कंप्यूटर जिन्हें इसे तैनात किया गया था) पर ठीक काम कर रहा था, वह था कि विंडोज 8 मशीन में यूआई एक्सेसिबिलिटी एप्लिकेशन (या कुछ अन्य यूआई ऑटोमेशन क्लाइंट) चल रहा था। जैसे ही मैंने अपनी विंडोज 7 विकास मशीन पर कथन आवेदन शुरू किया, मैं ऐप को उसी तरह दुर्घटनाग्रस्त करने में सक्षम था ..

एक बार जब मैं मूल समस्या को समझ गया, तो भी मैं यह पता लगाने में असमर्थ था वास्तव में कौन सा नियंत्रण समस्या पैदा कर रहा था लेकिन ऑनलाइन पढ़ने के लिए कस्टम नियंत्रण की सामान्य दिशा में इंगित करना प्रतीत होता था और इसलिए मैंने यह निर्धारित करने के लिए उन्मूलन की प्रक्रिया शुरू की कि कौन से कस्टम WPF नियंत्रण दोषी थे। मुझे दो कस्टम नियंत्रण मिले - एक जिसने डेटाग्रिड बढ़ाया, और दूसरा जो एक सूची बॉक्स बढ़ाया।

अंत में, मेरे मामले में समस्या का समाधान ItemsControlAutomationPeer बेस क्लास का विस्तार करने के लिए कस्टम कक्षाएं बनाना था और OnCreateAutomationPeer विधि को ओवरराइड करके मुद्दों वाले प्रत्येक कस्टम नियंत्रण पर ऑटोमेशन सहकर्मी प्रदान करना था।

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

कहाँ ControlSpecificCustomAutomationPeer वर्ग हो सकता है कम से कम इस तरह दिखता है:

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

@ एनएसएक्स। - मैं शर्त लगाता हूं .. मुझे पता है कि मैंने इसका पीछा करने में काफी समय बर्बाद कर दिया। –

+0

इसके लायक होने के लिए, हमें एक ही समस्या थी, लेकिन जब ऐप Win8 पर चल रहा था या हमने Win7 में Narrator चालू किया था। हमारा विभिन्न संपत्ति सेटर्स के बीच एक कठिन-से-डीबग बातचीत हो गया। संपत्ति सेट होने के बाद, उस कोड में कहीं हम इसे वापस शून्य पर सेट कर रहे थे। इससे पहले कि मैंने निदान किया, मैंने पाया कि उपर्युक्त समाधान स्वचालन सहकर्मी लक्षण 'तय' है। –

संबंधित मुद्दे