2010-03-12 11 views
9

जब मैं के साथ सी # 4.0 गतिशील खेल रहे हैं, मैंने पाया विचित्र बातें इस तरह कोड के साथ हो रहा:सिस्टम। गतिशील बग?

screenshot http://img717.imageshack.us/img717/4914/10435230.png

:

using System.Dynamic; 

sealed class Foo : DynamicObject 
{ 
    public override bool TryInvoke(
     InvokeBinder binder, object[] args, out object result) 
    { 
     result = new object(); 
     return true; 
    } 

    static void Main() 
    { 
     dynamic foo = new Foo(); 

     var t1 = foo(0); 
     var t2 = foo(0); 
     var t3 = foo(0); 
     var t4 = foo(0); 
     var t5 = foo(0); 
    } 
} 

ठीक है, यह काम करता है लेकिन ... IntelliTrace खिड़की पर एक नज़र

तो प्रत्येक आमंत्रण (और गतिशील वस्तु पर भी अन्य परिचालन) दो बार अजीब अपवाद फेंकने और पकड़ने का कारण बनता है!

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

लेकिन ... उपरोक्त कोड का व्यवहार बहुत अजीब लग रहा है। हो सकता है कि डायनामिक ऑब्जेक्ट पर किसी भी ऑपरेशन के बाद दो बार अपवाद फेंकना और पकड़ना - एक बग है?

+0

स्क्रीनशॉट गुम;) – TomTom

+0

अजीब, सभी, मेरे लिए ठीक है ... imageshack के लिए फिर से अपलोड की गई THX – ControlFlow

उत्तर

3

धन्यवाद, मैंने एक बग खोला है, हम इसे देख रहे हैं। एक बार जब मैं कंपाइलर टीम से सुनता हूं तो मैं इसे अपडेट कर दूंगा। यह सी # रनटाइम बाइंडर (माइक्रोसॉफ्ट.CSharp.dll) में फेंक रहा है।

यदि आप डीबग.एक्सप्शन में पहली बार मौका अपवाद सक्षम करते हैं, तो आप इसे हिट करेंगे। IntelliTrace के पास बग के साथ कुछ लेना देना नहीं है, यह आपको केवल पहली मौका अपवाद फेंक दिया और निगल रहा है।

+0

धन्यवाद, किरिल! पहली मौका अपवादों के बारे में नहीं जानते ... – ControlFlow

+1

http://blogs.msdn.com/kirillosenkov/archive/2008/12/07/how-to-debug-crashes-and-hangs.aspx :) –

2

मुझे लगता है कि अपवाद कुछ डीबगर के कारण होता है जो कुछ भी निरीक्षण करने की कोशिश कर रहा है।

यदि आप किसी भी अपवाद को फेंकने के लिए विजुअल स्टूडियो को रोकने के लिए कहते हैं तो यह रुकता नहीं है और यह इंगित करता है कि अपवाद के लिए डीबगर वास्तविक कोड नहीं है।

+0

लगता है कि आप सही हैं, आर्वे! मैंने निष्पादन मॉनिटर को थ्रो अपवादों की गणना करने के लिए लॉन्च किया है और डिबगर के बिना रिलीज बिल्ड में प्रोग्राम चलाया है - कोई अपवाद फेंक रहा है ... – ControlFlow

+0

बस डीबग -> अपवाद (Ctrl + D, E) में पहले-मौका अपवाद सक्षम करें और चेक करें सभी चेक बॉक्स आप इसे हिट करेंगे। –

0

गतिशील के साथ समान बग, लेकिन यह एमवीसी 5 नियंत्रक में रनटाइम त्रुटि का कारण बनता है। यह apperrs जब मैं इस विधि नहीं कहा जाता है के बावजूद एक सामान्य संग्रह के साथ काम कर रहे विधि जोड़ सकते हैं और कहीं भी

नहीं referensed
[NullReferenceException] at 
Microsoft.CSharp.RuntimeBinder.SymbolTable.GetOriginalTypeParameterType(Type t) +10 
Microsoft.CSharp.RuntimeBinder.SymbolTable.AreTypeParametersEquivalent(Type t1, Type t2) +941668 
Microsoft.CSharp.RuntimeBinder.SymbolTable.LoadMethodTypeParameter(MethodSymbol parent, Type t) +60 
Microsoft.CSharp.RuntimeBinder.SymbolTable.LoadSymbolsFromType(Type originalType) +639 
    Microsoft.CSharp.RuntimeBinder.SymbolTable.GetConstructedType(Type type, AggregateSymbol agg) +112 
Microsoft.CSharp.RuntimeBinder.SymbolTable.LoadSymbolsFromType(Type originalType) +426 
Microsoft.CSharp.RuntimeBinder.SymbolTable.AddMethodToSymbolTable(MemberInfo member, AggregateSymbol callingAggregate, MethodKindEnum kind) +540 
Microsoft.CSharp.RuntimeBinder.SymbolTable.AddNamesInInheritanceHierarchy(String name, BindingFlags flags, List`1 inheritance) +621 
Microsoft.CSharp.RuntimeBinder.SymbolTable.PopulateSymbolTableWithName(String name, IEnumerable`1 typeArguments, Type callingType) +194 
Microsoft.CSharp.RuntimeBinder.RuntimeBinder.PopulateSymbolTableWithPayloadInformation(DynamicMetaObjectBinder payload, Type callingType, ArgumentObject[] arguments) +456 
Microsoft.CSharp.RuntimeBinder.RuntimeBinder.BindCore(DynamicMetaObjectBinder payload, IEnumerable`1 parameters, DynamicMetaObject[] args, DynamicMetaObject& deferredBinding) +98 
Microsoft.CSharp.RuntimeBinder.RuntimeBinder.Bind(DynamicMetaObjectBinder payload, IEnumerable`1 parameters, DynamicMetaObject[] args, DynamicMetaObject& deferredBinding) +74 
Microsoft.CSharp.RuntimeBinder.BinderHelper.Bind(DynamicMetaObjectBinder action, RuntimeBinder binder, IEnumerable`1 args, IEnumerable`1 arginfos, DynamicMetaObject onBindingError) +770   
Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder.FallbackInvokeMember(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) +80 
System.Dynamic.DynamicMetaObject.BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) +31 
System.Dynamic.InvokeMemberBinder.Bind(DynamicMetaObject target, DynamicMetaObject[] args) +53 
System.Dynamic.DynamicMetaObjectBinder.Bind(Object[] args, ReadOnlyCollection`1 parameters, LabelTarget returnLabel) +224 
System.Runtime.CompilerServices.CallSiteBinder.BindCore(CallSite`1 site, Object[] args) +127 
System.Dynamic.UpdateDelegates.UpdateAndExecute3(CallSite site, T0 arg0, T1 arg1, T2 arg2) +686 
संबंधित मुद्दे