__DynamicallyInvokable विशेषता क्या है?


181

System.Linq.Enumerableडॉटपेक के माध्यम से देखने पर मुझे लगता है कि कुछ तरीके एक [__DynamicallyInvokable]विशेषता के साथ सुगंधित हैं ।

यह विशेषता क्या भूमिका निभाती है? क्या यह डॉटपेक द्वारा कुछ जोड़ा गया है या क्या यह एक और भूमिका निभाता है, शायद संकलक को सूचित करना कि तरीकों का अनुकूलन कैसे करना है?


2
String.Empty में यह भी है, btw।
मार्क Gravell

1
तो करता है IReadOnlyCollection<T>
ड्रू नोक

1
और System.ServiceModel v3'एस BasicHttpBinding.TextEncoding(जो V4 में एक नया आधार वर्ग के लिए आगे बढ़े और हो जाता है है HttpBindingBase.TextEncoding)
रूबेन Bartelink

इसका उपयोग सिस्टम एनम में पूर्णांक मानों के लिए भी किया जाता है जैसे DayOfWeek
beauXjames

एक बार मैं एक मामला है जब इस विशेषता के साथ विधि विधानसभा उत्पन्न में inlined गया था (DateTime.AddYears, नेट 4.5)
gdbdable

जवाबों:


139

यह अनिर्दिष्ट है, लेकिन यह .NET 4.5 में अनुकूलन में से एक जैसा दिखता है। यह प्रतिबिंब प्रकार की सूचना कैश को प्राइम करने के लिए इस्तेमाल किया गया प्रतीत होता है, जिससे सामान्य फ्रेमवर्क प्रकारों पर बाद का प्रतिबिंब कोड तेजी से चलता है। System.Reflection.Assembly.cs, RuntimeAssembly.FLags संपत्ति के संदर्भ स्रोत में इसके बारे में एक टिप्पणी है:

 // Each blessed API will be annotated with a "__DynamicallyInvokableAttribute".
 // This "__DynamicallyInvokableAttribute" is a type defined in its own assembly.
 // So the ctor is always a MethodDef and the type a TypeDef.
 // We cache this ctor MethodDef token for faster custom attribute lookup.
 // If this attribute type doesn't exist in the assembly, it means the assembly
 // doesn't contain any blessed APIs.
 Type invocableAttribute = GetType("__DynamicallyInvokableAttribute", false);
 if (invocableAttribute != null)
 {
     Contract.Assert(((MetadataToken)invocableAttribute.MetadataToken).IsTypeDef);

     ConstructorInfo ctor = invocableAttribute.GetConstructor(Type.EmptyTypes);
     Contract.Assert(ctor != null);

     int token = ctor.MetadataToken;
     Contract.Assert(((MetadataToken)token).IsMethodDef);

     flags |= (ASSEMBLY_FLAGS)token & ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_TOKEN_MASK;
 }

आगे संकेत के बिना "धन्य एपीआई" का क्या मतलब हो सकता है। हालांकि यह इस संदर्भ से स्पष्ट है कि यह केवल रूपरेखा के प्रकारों पर ही काम करेगा। कहीं पर अतिरिक्त कोड होना चाहिए जो प्रकार और विधियों पर लागू विशेषता की जांच करता है। कोई विचार नहीं है कि यह कहाँ स्थित है, लेकिन यह देखते हुए कि कैशिंग में शॉट लगाने के लिए सभी .NET प्रकारों का एक दृश्य होना चाहिए, मैं केवल Ngen.exe के बारे में सोच सकता हूं।


7
ऐसा लगता है कि WP8 पर API उपलब्ध है या नहीं यह जांचने के लिए संग्रहीत मूल्य का उपयोग किया जा रहा है।
usr

1
+1 ओपी के क्यू पर मेरी टिप्पणी देखें - एक मामला जहां सीएलआर इस पर आधारित
चालबाजी करता दिख रहा है

2
यह [TypeForwardTo] चाल है, कुछ पूरी तरह से अलग है।
हंस पासंत

@ हंसपसंद दिलचस्प - लगता है कि मैं अच्छी तरह से गलत हो सकता हूं ... मूल विधानसभा / प्रकार की जांच करने के बारे में नहीं सोचा था। लब्बोलुआब यह है कि 4.5 पर उद्धृत संपत्ति (प्रकार नहीं) जहां 3.5 (तकनीकी रूप से System.ServiceModel 3.0) पर थी, उसके सापेक्ष स्थानांतरित हो गई है । मैंने यह मान लिया था कि एकीकरण एक ला mscorlibसंदर्भ था, लेकिन मेरे विशिष्ट मुद्दे पर कुछ भी करने के लिए बहुत कुछ घूम रहा है - वापस रिपोर्ट करेंगे और / या मेरी टिप्पणी के कारण किसी भी भ्रामक टोन को हटा
देंगे

1
@HansPassant आगे के शोध से ... खिचड़ी भाषा कुछ भी देखिए फ़ॉरवर्डिंग प्रकार के अलावा अन्य सामान करने वाले फ़ॉरवर्डिंग इस बिंदु पर मैं कुछ पूरी तरह से अलग बिट के साथ अलग होने की भीख माँगता हूँ । काम पर बल बस इतना है कि जब आपके पास एक CLR2 असेंबली का संदर्भ होता है System.ServiceModel v3, तो इसे CLR4 ऑटो-अपग्रेड के तहत लोड किया जाता है System.ServiceModel v4। मजेदार बिट यह है कि .NET 4.5 System.ServiceModelएक नए बेस क्लास में ड्रॉपिंग के बिट्स के स्थान पर अद्यतन करता है और संपत्ति को एक स्तर से नीचे ले जाता है
रूबेन बार्टलिंक

23

मैंने पाया कि यह Runtime*Info.IsNonW8PFrameworkAPI()आंतरिक विधियों के सूट में उपयोग किया जाता है । इस विशेषता को एक सदस्य पर रखा जाने से IsNonW8PFrameworkAPI () falseइसके लिए वापस आ जाता है और इस तरह सदस्य को WinRT अनुप्रयोगों में उपलब्ध कराता है और The API '...' cannot be used on the current platform.अपवाद को बंद कर देता है।

प्रोफाइलर लेखकों को इस विशेषता को उनके प्रोफाइलर द्वारा फ्रेमवर्क असेंबली में उत्सर्जित सदस्यों पर रखना चाहिए, अगर वे उन्हें WinRT के तहत एक्सेस करना चाहते हैं।


1
हाँ, @Hans द्वारा पाया गया कोड उन झंडों को सेट करता है RuntimeAssembly.InvocableAttributeCtorToken, जिनके द्वारा देखे गए IsNonW8PFrameworkAPI()तरीकों को कहा जाता है ।
मार्क हर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.