مشاركة عبر


تحويل العضو الذي تم تصديره

يصف هذا الموضوع كيفية تحويل عملية التصدير للأعضاء التاليين:

  • الأساليب

  • Properties

  • أحداث

الأساليب

يتوقع عملاء COM إلى استدعاء الوظائف، وتمرير أنواع بيانات COM مألوفة مثل المعلمات، وتلقى HRESULTs بالعودة. في مجال.NET، تشغيل الرغم من ذلك، الخاصة بك تتضمن الفئات لا يوجد مثل هذا التقييد تشغيل أنواع الإرجاع (و، لا تستخدم في الواقع، HRESULTs).

في ترتيب إلى تلبية كلا النموذجين، لدى كل أسلوب من نوع المدارة توقيع.NET وعلى توقيع COM ضمنية. كانت التواقيع الثاني مختلفة بشكل عام. عملاء.NET التفاعل مع الخادم استخدام توقيع.NET، بينما (من الممكن أن تكون في نفس الوقت) التفاعل مع عملاء COM الخادم استخدام توقيع COM. الملقم بتنفيذ الأسلوب مع توقيع.NET ووقت التشغيل التنظيم والإرسال خدمة هو مسؤولاً عن توفير يعمل كعب روتين مع توقيع COM الذي المفوضون استدعاء الأسلوب الذي تتم إدارته.

ترجمة HRESULT

توقيع مدارة هو محولها إلى توقيع ما لم تتم إدارته بواسطة تغيير القيمة الإرجاع المدارة إلى [بنفاد, retval] معلمة وتغيير النوع غير مدارة القيمة الإرجاع إلى HRESULT. على سبيل المثال، DoSomethingقد يحتوي أسلوب التواقيع التالية:

مدارة توقيع

short DoSomething(short i);

توقيع غير المدار

HRESULT DoSomething([in] short i, [out, retval] short *rv);

لاحظ أنه توقيع COM HRESULT إرجاع وتم إخراج المعلمة للبت القيمة المرجعة. إرجاع القيمة التي يتم إرجاعها من التنفيذ المدارة دوماً كـ [مهلة, retval] معلمة التي تم إضافتها إلى إنهاء توقيع غير مدارة، حيث كـ توقيع غير المدارة دوماً بإرجاع HRESULT. إذا كان مدار أسلوب يحتوي على قيمة فارغة العودة، يحذف وقت التشغيل في [انتهت, retval] معلمة. فعلى سبيل المثال:

مدارة توقيع

void DoSomething(short i);

توقيع غير المدار

HRESULT DoSomething([in] short i);

في بعض الحالات، فإنه هو المفضل لالمغادرة المدارة توقيع دون تغيير. يمكنك استخدام من PreserveSigAttribute إلى القيام بذلك. فعلى سبيل المثال:

مدارة توقيع

[PreserveSig] short DoSomething(short i);

توقيع غير المدار

short DoSomething ([in] short i);

وجود التواقيع بطريقة مميزة الثاني يسهل إلى استخدم الفئة من عملاء كلا من COM و.NET بشكل متميز. بالإضافة إلى ذلك، يمكن للعملاء كل من COM و.NET استخدام.NET فئة في نفس الوقت. كالكاتب فئة، تطبيق توقيع التي تمت إدارتها فقط. استخدام Tlbexp.exe (أو API مكافئ) تلقائياً، يتم تصدير توقيع إلى مكتبة نوع التي تم إنشاؤها للفئة.

الأساليب الزائدة

وتشغيل الرغم من أن تعتمد.NET وظائف overloaded، الواجهة IDispatch يعتمد فقط تشغيل ‏‏اسم الأسلوب للتوثيق، بدلاً من توقيع الأسلوب كاملة. هو ولذلك لا يمكنه دعم وظائف overloaded. ومع ذلك، لتوفير الوصول إلى محمل بشكل زائد وظائف نوع، Tlbexp.exe decorates أسماء وظائف overloaded مع العدد ترتيبي رقم لذلك كل اسم الأسلوب هو فريدة.

مدارة ما يلي و إظهار التواقيع غير مدار تضمين الأرقام:

مدارة توقيع

interface INew {
public:
    void DoSomething();
    void DoSomething(short s);
    void DoSomething(short l);
    void DoSomething(float f);
    void DoSomething(double d);
}

توقيع غير المدار

interface INew {
    void DoSomething();
    void DoSomething_2(short s);
    void DoSomething_3(short l);
    void DoSomething_4(float f);
    void DoSomething_5(double d);
}

يظهر توقيع COM وظائف كـ مفردة DoSomethingتزيين أسلوب متبوعاً بسلسلة من DoSomething_x وظائف، الموقع يبدأ x 2 وزيادات لكل محمل بشكل زائد النموذج الأسلوب. لاحظ أن بعض الأساليب overloaded يمكن وراثة من نوع أساس. ومع ذلك، هناك أي ضمان بأن محملة فوق طاقتها وظائف تحتفظ بنفس الرقم كالتطورات الإصدار نوع.

وعلى الرغم من أنه يمكن أن يستخدم العملاء.NET نموذج overloaded أسلوب، يكون عملاء COM الوصول إلى وظائف المزين. تعرض مستعرضات الكائن الجميع النماذج الأسلوب المزين مع توقيع الأسلوب لتمكينك من تحديد الأسلوب الصحيح. العميل المرتبطة المتأخر يمكن أيضا استدعاء IDispatch::GetIdsOfNames، تمرير في اسم المزين إلى get DispID أي محمل بشكل زائد أسلوب.

Properties

مدارة الفئات و يمكن أن يكون للواجهات الخصائص. خاصية مدارة هو من نوع بيانات محددة التي قد تكون مقترنة أسلوب إحضار و تعيين أسلوب. يتم تعريف هذه الطرق شكل منفصل تماما مثل أي أسلوب آخر. يظهر المثال تعليمات برمجية التالي واجهة الذي يحتوي على Heightخاصية. الفئات التي يقوم بتطبيق الواجهة مطلوبة إلى توفر يحصل وتعيين أسلوب للخاصية.

    interface IMammal {
 
    IMammal Mother{get;set;}
    IMammal Father{get;set;}
    int     Height{get;set;}
    int     Weight{get;set;}

    }

    class Human : IMammal
    {
        int weight;
        int height;
        IMammal father;
        IMammal mother;

        public IMammal Mother { get { return mother; } set { mother = value; } }
        public IMammal Father { get { return father; } set { father = value; } }
        public int Height { get { return height; } set { height = value; } }
        public int Weight { get { return weight; } set { weight = value; } }
    }

أثناء التصدير، يحول Tlbexp.exe أسلوب تعيين خاصية إلى [propput] و أسلوب يحصل إلى [propيحصل]. اسم خاصية في COM تبقى كما هي كـ اسم خاصية المدارة. تتضمن هذه قاعدة استثناء ما يلي:

  • في حالة كتابة الخاصية، باستثناء أنواع القيم، هو فئة أو الواجهة، يصبح أسلوب تعيين الخاصية [propputref], إعطاء المعلمات بمستوى مضافة من indirection.

  • إذا كانت خاصية ليس قراءة أو تعيين أسلوب، Tlbexp.exe له يحذف خاصية من نوع المكتبة.

مثل الخصائص، يتم تصدير حقول التي تمت إدارتها نوع المكتبة. وقت التشغيل التنظيم والإرسال الخدمة تلقائياً بإنشاء في يحصل و التعيين وظائف لكافة حقول العامة. أثناء عملية تحويل، ينشئ Tlbexp.exe [propput] (أو [propputref]) دالة ودالة [propget] لكل حقل، كالتالي نوع عروض تمثيل المكتبة.

تمثيل مكتبة نوع

interface IMammal : IDispatch {
         [propget]    HRESULT Mother([out, retval] IMammal** pRetVal);
         [propputref] HRESULT Mother([in] IMammal* pRetVal);
         [propget]    HRESULT Father([out, retval] IMammal** pRetVal);
         [propputref] HRESULT Father([in] IMammal* pRetVal);
         [propget]    HRESULT Height([out, retval] long* pRetVal);
         [propput]    HRESULT Height([in] long pRetVal);
         [propget]    HRESULT Weight([out, retval] long* pRetVal);
         [propput]    HRESULT Weight([in] long pRetVal);
         [propget]    HRESULT Age([out, retval] long* pRetVal);
         [propput]    HRESULT Age([in] long pRetVal);    
};

أحداث

إذا لم تكن معتاداً على طراز حدث في توافق COM، راجع الإدارة من و Unmanaged الأحداث. مدارة أنواع تنفيذ الأحداث باستخدام طراز حدث المفوض-أساس. على سبيل المثال، Class1Eventsالواجهة في ما يلي تعليمات برمجية المثال يرفع Clickحدث.

    Public Delegate Sub ClickDelegate()
    <GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967"), _
    InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)>

    Public Interface Class1Event
        Sub Click ()
    End Interface
<ComSourceInterfaces("Class1Event, EventSrc")> _
    Public Class Class1
        Public Event Click As ClickDelegate
   End Class
    public delegate void Click();

    public interface Class1Event
    {
        void Click();
    }
   [ComSourceInterfaces("Class1Event, EventSrc")]
    public class Class1
    {
        public event ClickDelegate Click;
    }

أثناء التصدير، يضع Tlbexp.exe واجهة حدث كـ المصدر في coclكـs الخاص به. كنوع المكتبة تمثيل يوضح التالي، الذي تم تصديره ComClass1Eventsواجهة هو وضعت واجهة المصدر.

تمثيل مكتبة نوع

    disinterface Class1Event {
        properties:
        methods:
        [id(0x60020000)]
        HRESULT Click();
    };

    coclass Class1
    {
    …
    [default, source] Class1Event;
    };

راجع أيضًا:

المبادئ

تحويل تجميع الذي تم تصديره

تحويل وحدة نمطية? التي تم تصديرها

تحويل نوع المصدر

تحويل المعلمات التي تم تصديرها

موارد أخرى

تجميع إلى نوع المهمة الموجزة لتحويل مكتبة