مشاركة عبر


تقديم الواجهة في فئة

فئة هو واجهة، والتي هي غير المعرفة بوضوح في تعليمات برمجية المدارة، واجهة الذي يستهدف الجميع الأساليب العامة، خصائص والحقول والأحداث التي يتعرض صراحة تشغيل الكائن.NET. وهذا واجهة يمكن أن يكون مزدوج أو الإرسال فقط واجهة. يتلقى الواجهة فئة الفئة.NET نفسه، مسبوقة بواسطة تسطير أسفل السطر. على سبيل المثال، لفئة Mammal، واجهة فئة هو _Mammal.

على اشتقاق فئات، الكشف عن فئة الواجهة أيضا الجميع الطرق العامة والخصائص وحقول فئة الأساس. كشف فئة مشتقة أيضا على واجهة فئة لكل فئة أساسية. على سبيل المثال، في حالة توسيع الفئة Mammal الفئة MammalSuperclass، الذي نفسه بتوسيع النظام.كائن، كشف الكائن.NET إلى العملاء الثلاثة فئة واجهات COM المسمى _Mammal و _MammalSuperclass _كائن.

على سبيل المثال، خذ بعين الاعتبار فئة.NET التالية:

' Applies the ClassInterfaceAttribute to set the interface to dual.
<ClassInterface(ClassInterfaceType.AutoDual)> _
' Implicitly extends System.Object.
Public Class Mammal
    Sub Eat()
    Sub Breathe()
    Sub Sleep()
End Class
// Applies the ClassInterfaceAttribute to set the interface to dual.
[ClassInterface(ClassInterfaceType.AutoDual)]
// Implicitly extends System.Object.
public class Mammal
{
    void  Eat();
    void  Breathe():
    void  Sleep();
}

يمكن الحصول على العميل COM مؤشر إلى واجهة فئة باسم _Mammal، التي هو في مكتبة النوع الذي الأداة مصدر مكتبة النوع (Tlbexp.exe) . إذا Mammalفئة تطبيق الواجهات أو أكثر، قد تظهر الواجهات تحت coclass.

   [odl, uuid(…), hidden, dual, nonextensible, oleautomation]
   interface _Mammal : IDispatch
   {
       [id(0x00000000), propget] HRESULT ToString([out, retval] BSTR*
           pRetVal);
       [id(0x60020001)] HRESULT Equals([in] VARIANT obj, [out, retval]
           VARIANT_BOOL* pRetVal);
       [id(0x60020002)] HRESULT GetHashCode([out, retval] short* pRetVal);
       [id(0x60020003)] HRESULT GetType([out, retval] _Type** pRetVal);
       [id(0x6002000d)] HRESULT Eat();
       [id(0x6002000e)] HRESULT Breathe();
       [id(0x6002000f)] HRESULT Sleep();
   }
   [uuid(…)]
   coclass Mammal 
   {
       [default] interface _Mammal;
   }

إنشاء فئة واجهة أمرا اختيارياً. بشكل افتراضي، ينشئ توافق COM واجهة الإرسال فقط لكل فئة التصدير إلى مكتبة نوع. يمكنك منع أو تعديل الإنشاء تلقائي لهذا واجهة بواسطة تطبيق ClassInterfaceAttributeإلى فئة. الخاص بك وعلى الرغم من أنه يمكن للواجهة فئة تسهيل مهمة تعريض مدارة الفئات إلى COM، استخداماته تقتصر.

ملاحظة تنبيهتنبيه

استخدام فئة يعقد الواجهة، بدلاً من وضوح تعريف الخاص بك، تعيين الإصدارات المستقبلية من مدارة الخاص بك فئة.الرجاء قراءة الإرشادات التالية قبل استخدام واجهة الفئة.

قم بتعريف واجهة واضحة لعملاء COM باستخدام بدلاً من إنشاء فئة الواجهة.

Because توافق COM generates a فئة واجهة automatically, ينشر-الإصدار التغييرات إلى your فئة can alter the تخطيط of the فئة واجهة exposed بواسطة the وقت تشغيل اللغة العامة. Since COM clients are typically unprepared إلى مؤشر التغييرات في the تخطيط of an واجهة, they فاصل if you تغيير the عضو تخطيط of the فئة.

This guideline reinforces the notion that الواجهات exposed إلى COM clients must remain unchangeable. إلى reduce the خطر of breaking COM clients بواسطة inadvertently reordering the واجهة تخطيط, isolate الجميع التغييرات إلى the فئة من the واجهة تخطيط بواسطة بوضوح defining الواجهات.

استخدم the ClassInterfaceAttribute إلى disengage the تلقائي generation of the فئة واجهة و implement an explicit واجهة for the فئة, كـ the following تعليمات برمجية fragment shows:

<ClassInterface(ClassInterfaceType.None)>Public Class LoanApp
    Implements IExplicit
    Sub M() Implements IExplicit.M
…
End Class
[ClassInterface(ClassInterfaceType.None)]
public class LoanApp : IExplicit {
    void M();
}

The ClassInterfaceType.بلا القيمة prevents the فئة واجهة من being generated when the فئة بيانات التعريف هو exported إلى a نوع مكتبة. في the preceding مثال, COM clients can الوصول the LoanApp فئة فقط through the IExplicit واجهة.

Avoid تخزين مؤقت dispatch identifiers (DispIds).

استخدام فئة هو واجهة خياراً مقبولاً لعملاء مبرمجة عملاء Microsoft Office 2010 Suite Visual أساسى 6.0 أو أي عميل منضم المتأخرة لا بالتخزين المؤقت DispIds الأعضاء الواجهة. تعريف DispIds الأعضاء الواجهة إلى تمكين ربط في وقت التشغيل.

لفئة الواجهة، بإنشاء DهوpIds هو استناداً إلى موضع العضو في الواجهة. إذا قمت بتغيير ترتيب الأعضاء والتصدير فئة إلى مكتبة نوع، سيتم تبديل DispIds التي تم إنشاؤها في فئة الواجهة.

إلى تجنب فصل عملاء COM متأخرة المرتبطة عند استخدام واجهة الفئة، يطبق ClassInterfaceAttribute مع ClassInterfaceType.AuإلىDispatch القيمة. هذه القيمة تطبيق واجهة فئة الإرسال فقط، ولكن يتجاهل وصف واجهة من مكتبة النوع. بدون وصفاً لواجهة، العملاء الذين لم أتمكن من إلى ذاكرة تخزين مؤقت DispIds في وقت التحويل البرمجي. وعلى الرغم من أن هذا هو الخيار الافتراضي واجهة نوع فئة واجهة، يمكنك يطبق السمة بوضوح.

<ClassInterface(ClassInterfaceType.AutoDispatch)> Public Class LoanApp
    Implements IAnother
    Sub M() Implements IAnother.M
…
End Class
[ClassInterface(ClassInterfaceType.AutoDispatch]
public class LoanApp : IAnother {
    void M();
}

إلى الحصول على DispId لعضو واجهة في وقت التشغيل، يمكنك الاتصال بعملاء COM من IDispatch.GetIdsOfNames. استدعاء أسلوب تشغيل واجهة، تمرير DispId التي يتم إرجاعها كوسيطة إلى من IDispatch.Invoke.

تقييد استخدام خيار واجهة مزدوجة لفئة الواجهة.

تمكين واجهات الثنائي الربط المبكر والمتأخر إلى الواجهة الأعضاء عن طريق عملاء COM. وقت التصميم و أثناء الاختبار، قد تجد أنه مفيدة لتعيين فئة الواجهة إلى مزدوج. فئة مدارة (وبها فئات أساسية) التي سيتم عدم تعديل، th هو خيار هو مقبولة أيضا. في الجميع الحالات الأخرى، تجنب تعيين فئة الواجهة إلى مزدوج.

قد تكون واجهة ثنائي الذي تم إنشاؤه تلقائياً المناسب في بعض الحالات النادرة؛ على الرغم من ذلك، أكثر غالباً ما يقوم بإنشاء التعقيد المتعلقة بالإصدار. على سبيل المثال، عملاء COM باستخدام واجهة فئة لفئة مشتقة يمكن بسهولة قطع مع التغييرات إلى فئة الأساس. عندما يوفر طرف ثالث للفئة الأساسية، والتخطيط لواجهة الفئة هو خارج عنصر التحكم الخاص بك. Further, unlike a dispatch-فقط واجهة, a dual واجهة (ClassInterface.AutoDual) provides a وصف of the فئة واجهة في the exported نوع مكتبة. Such a وصف encourages late-حدود clients إلى ذاكرة تخزين مؤقت DispIds at تشغيل الوقت.

راجع أيضًا:

المرجع

ClassInterfaceAttribute

المبادئ

COM التفاف الاستدعاء

تعريف أنواع.NET ل Interoperation