__DynamicallyIvvable ਗੁਣ কী?


181

মাধ্যমে দেখার জন্যে System.Linq.EnumerableDotPeek আমি বিজ্ঞপ্তিতে কিছু পদ্ধতি একটি সঙ্গে দান করছেন যে [__DynamicallyInvokable]অ্যাট্রিবিউট।

এই বৈশিষ্ট্যটি কী ভূমিকা পালন করে? এটি কী ডটপিকের সাথে যুক্ত কিছু বা এটি কী অন্য ভূমিকা পালন করে, সম্ভবত পদ্ধতিগুলি সর্বোত্তম করার বিষয়ে সংকলককে অবহিত করছে?


2
স্ট্রিং.এম্পটিরও এটি রয়েছে, বিটিডব্লিউ।
মার্ক Gravell

1
তাই করে IReadOnlyCollection<T>
ড্র নোকস

1
এবং System.ServiceModel v3এর BasicHttpBinding.TextEncoding(যা ভি 4 এ নতুন বেস ক্লাসে উঠে গেছে এবং পরিণত হয়েছে HttpBindingBase.TextEncoding)
রুবেন বারটেলিংক


একবার আমার কেস হয়েছে যখন এই বৈশিষ্ট্যটি সহ পদ্ধতিটি উত্পন্ন সমাবেশে অন্তর্ভুক্ত করা হয়েছিল (
ডেটটাইম.এডস্লস ক্লাস

উত্তর:


139

এটি অননুমোদিত, তবে এটি নেট 4.5.৪ এর একটি অপ্টিমাইজেশনের মতো দেখাচ্ছে। এটি সাধারণ কাঠামোর ধরণের উপরের প্রতিবিম্ব কোডটি দ্রুত চালিত করে, প্রতিবিম্ব প্রকারের তথ্য ক্যাশেটিকে প্রধান হিসাবে ব্যবহার করা হয় বলে মনে হয়। সিস্টেমের জন্য রেফারেন্স উত্সে এটি সম্পর্কে একটি মন্তব্য আছে efরফ্লেশন.আস্যাবেশন.সি, রানটাইমঅ্যাসবেশন.ফ্লেগ্স সম্পত্তি:

 // 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 ধরণের দৃষ্টিভঙ্গি থাকা দরকার বলে আমি কেবল এনজেন.এক্স.ই সম্পর্কে ভাবতে পারি।


7
দেখে মনে হচ্ছে সঞ্চিত মানটি ডাব্লুপি 8 এ উপলব্ধ কিনা তা পরীক্ষা করতে ব্যবহার করা হচ্ছে।
usr ডিরেক্টরির

1
+1 ওপি'র কিউ সম্পর্কে আমার মন্তব্য দেখুন - এমন একটি ক্ষেত্রে যেখানে সিএলআর এর ভিত্তিতে কৌশল অবলম্বন করছে বলে মনে হচ্ছে একীকরণের অধীনে পদ্ধতিগুলির সামান্য 'চালচলন (যেমন একটি নতুন বেস শ্রেণীর উপরে এক স্তর নিচে) পরিচালনা করা
রুবেন বার্টেলিংক

2
এটি [টাইপফোরওয়ার্ডটো] কৌশল, সম্পূর্ণ আলাদা something
হান্স প্যাস্যান্ট

@ হ্যানসপাসান্ট আকর্ষণীয় - মনে হচ্ছে আমি ভাল হতে পারি তাই ... আসল সমাবেশ / প্রকার পরীক্ষা করার কথা ভাবেনি। নীচের লাইনটি হল 4.5 তে উদ্ধৃত সম্পত্তি (ধরণের নয়) যেখানে এটি ছিল 3.5 এর সাথে তুলনামূলকভাবে সরানো হয়েছে (প্রযুক্তিগতভাবে System.ServiceModel 3.0)। আমি ধরে নিয়েছিলাম যে একীকরণের একটি লা mscorlibরেফারেন্স খেলতে ছিল তবে যাই হোক না কেন আমার নির্দিষ্ট ইস্যুটি সম্পর্কে প্রচুর পরিমাণে ঘুরতে এসেছে - ফিরে রিপোর্ট করবে এবং / অথবা আমার মন্তব্যে কোনও বিভ্রান্তিমূলক সুর মুছে ফেলবে ...
রুবেন বারটেলিংক

1
@ হ্যান্সপাস্যান্ট আরও গবেষণা থেকে ... আর কিছুই দেখতে পারা যায় না ফরোয়ার্ডিং টাইপ ছাড়া অন্য জিনিস ফরোয়ার্ডিং করা তাই এই মুহুর্তে আমি সম্পূর্ণ ভিন্ন কিছু দিয়ে পৃথক হতে অনুরোধ করছি । কার্যক্ষেত্রের বাহিনীগুলি কেবলমাত্র যখন আপনার কাছে সিএলআর 2 বিধানসভা রেফারেন্স হয় System.ServiceModel v3, এটিকে সিএলআর 4 স্বতঃ-আপগ্রেডের আওতায় লোড করা হয় System.ServiceModel v4। মজাদার বিটটি হ'ল নেট .৪.৫ System.ServiceModelনতুন বেস ক্লাসের নীচে নেমে যাওয়ার বিটগুলিতে স্থান আপডেট করে এবং সম্পত্তিটি একটি স্তরের নিচে নিয়ে যায়
রুবেন বারটেলিংক

23

আমি দেখতে পেলাম যে এটি Runtime*Info.IsNonW8PFrameworkAPI()অভ্যন্তরীণ পদ্ধতির স্যুটটিতে ব্যবহৃত হয়েছে । কোনও সদস্যের উপর এই বৈশিষ্ট্যটি স্থাপন করা ইসননডাব্লু 8 পিফ্রেমওয়ার্কপিআই () এর falseজন্য ফিরে আসে এবং এভাবে সদস্যকে উইনআরটি অ্যাপ্লিকেশনগুলিতে উপলব্ধ করে এবং The API '...' cannot be used on the current platform.ব্যতিক্রমটি বন্ধ করে দেয় ।

প্রোফাইল লেখকরা যদি তাদের উইনআরটি-র অধীনে অ্যাক্সেস করতে চান তবে তাদের প্রোফাইলার দ্বারা ফ্রেমওয়ার্ক অ্যাসেম্বলিসে নির্গত সদস্যদের উপর এই বৈশিষ্ট্যটি স্থাপন করা উচিত।


1
হ্যাঁ, @ হান্সের দ্বারা প্রাপ্ত কোডটি পতাকাগুলি সন্ধান করে RuntimeAssembly.InvocableAttributeCtorTokenযা IsNonW8PFrameworkAPI()আপনার দ্বারা বর্ণিত পদ্ধতিগুলি দ্বারা ডাকা হয় ।
মার্ক হারড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.