مشاركة عبر


تحويل نوع المستوردة

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

  • الواجهات

  • الفئات

  • البنيات

  • عمليات التعداد

  • الثوابت

  • Typedefs

بشكل عام، يستورد Tlbimp.exe أنواع بنفس الاسم كانت عليه في مكتبة النوع الأصلي. أسماء داخل نوع المكتبة يجب أن تكون فريدة، وبالتالي التخلص من تسمية تعارض أثناء عملية تحويل. الجميع صالح نوع-أسماء المكتبة بأسماء تجميعاً صالحاً.

استيراد أنواع هي خاصة بمساحة الاسم تنتمي إليها، وهو نفس مكتبة النوع الأصلي. نوع s تعرف على حدة بمساحة الاسم الكامل الخاص بهم و نوع أسماء.

يمكنك التحكم بشكل واضح مدارة اسم نوع مستورد باستخدام سمة مكتبة نوع في مكتبة النوع. وهذا معرّفة بواسطة مستخدم هو معرّف السمة 0F21F359-AB84-41e8-9A78-36D110E6D2F9 . يلي نوع تعرض المكتبة إضافة السمة المعرفة من قبل مستخدم.

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

[  uuid(…),
    version(1.0)
]
library AcmeLib {
    interface Widget {};
    [custom(0F21F359-AB84-41e8-9A78-36D110E6D2F9, 
     "Acme.WidgetLib.Slingshot")]
    coclass Slingshot {};
};

على الرغم من أن يستورد Tlbimp.exe نوع المكتبة في مساحة الاسم AcmeLib، الفئة Slingshot يصبح Acme.WidgetLib.Slingshot.

الواجهات

عند تحويل عملية استيراد واجهة، شرائح خارج الجميع IUnknown و IDispatch وظائف. يطبق تحويل من GuidAttribute إلى الواجهة للاحتفاظ بمعرف الواجهة (IID) المعين في مكتبة النوع و من InterfaceTypeAttribute إلا إذا كان الواجهة مزدوج (اشتقاق من من IDispatch واجهة).

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

[uuid(…), ]
interface IWidget : IUnknown {
    HRESULT New()
    HRESULT Start()
};
[uuid(…), ]
interface IGadget : IWidget {
    HRESULT Baz()
};

أثناء تحويل، عملية استيراد بإضافة أساليب الواجهة الأساسية إلى الواجهة المشتقة منها. في المثال التالي، Newو Startتضاف إلى IGadgetالواجهة:

<Guid(…), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface IWidget
    Sub [New]()
    Sub Start()
End Interface

<Guid(…), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Interface IGadget
    Inherits IWidget
    Shadows Sub [New]()
    Shadows Sub Start()
    Sub Baz()
End Interface
[Guid(…), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IWidget {
    void New();
    void Start();
};
[Guid(…), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IGadget : IWidget {
    new void New();
    new void Start();
    void Baz();
};

الفئات

إنشاء عملية استيراد مدار فئة لتمثيل كل زملاء COM فئة، مما يوفر مدار فئة نفس الاسم كزملاء الأصلي فئة إلحاقها ب فئة. على سبيل المثال، NewNewerيصبح coclass NewNewerClass. يضيف تحويل GuidAttribute إلى فئة لالتقاط فئة معرّف (CLSID) الخاص زملاء فئة.

clكـs التي تمت إدارتها، بالإضافة إلى عملية استيراد بإضافة واجهة بنفس الاسم كـ coclكـs ويطبق CoClكـsAttribute لتحديد CLSID coclكـs الأصلي. هذا h واجهة كـ نفس معرف كـ الواجهة الافتراضية coclكـs. باستخدام هذه الواجهة، يمكنك دوماً التسجيل العملاء كما مستقبلات الأحداث.

بعكس coclass COM، يمكن أن تتضمن فئة مدارة الأعضاء الفئة. keeping مع الأسلوب.NET Framework، تحويل إضافة إلى كل فئة الأعضاء المقترنة بكل واجهة تطبيق بواسطة coclass. يمكن لمستخدمين الفئة المدارة استدعاء وظائف وخصائص نوع المدارة دون النوع أول لواجهة معينة. The استيراد عملية also adds a الافتراضي الدالة الإنشائية إلى each محول coclass. A الدالة الإنشائية makes it possible إلى إنشاء the فئة من مدارة تعليمات برمجية. (فئات without a الدالة الإنشائية cannot be تاريخ الإنشاء). The الافتراضي الدالة الإنشائية has لا الوسيطات; its implementation calls the فئة الأساس الدالة الإنشائية. If the noncreatable نوع مكتبة سمة هو applied إلى the coclass, the استيراد عملية does not إنشاء a الافتراضي الدالة الإنشائية for the فئة.

Since واجهة عضو أسماء are not دوماً فريد, اسم و DispId collisions among الأعضاء can occur. TlbImp.exe resolves اسم collisions بواسطة prefixing the واجهة اسم و an تسطير سفلي إلى the اسم of each colliding عضو of the فئة. الموقع the أسماء of الأعضاء collide, the أول واجهة listed في the coclass كشف remains بدون تغيير.

When DispId collisions occur, the استيراد عملية assigns DispIds إلى الأعضاء of the coclass's الافتراضي واجهة و بلا إلى the conflicting فئة الأعضاء. However, the استيراد عملية دوماً assigns DispIds إلى الأعضاء of the واجهة.

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

[uuid(…)]
interface INew : IDispatch {
    [id(0x100)] HRESULT DoFirst();
    [id(0x101)] HRESULT DoSecond();
}
[uuid(…)]
interface INewer : IDispatch {
    [id(0x100)] HRESULT DoNow();
    [id(0x101)] HRESULT DoSecond();
}
[uuid(…)]
coclass NewNewer  {
    [default] interface INew;
    interface INewer;
}

The محول أنواع appear كـ follows:

<Guid(…)> Public Interface INew
    …
End Interface

<Guid(…)> Public Interface INewer
    …
End Interface

<Guid(…)> Public Interface NewNewer
Inherits INew
    …
End Interface

<Guid(…)> Public Class NewNewerClass
Implements INew   
Implements INewer
Implements NewNewer
' Method implementation
     <DispId(100)> _
      …
End Class  
[Guid(…)]
public interface INew {…}

[Guid(…)]
public interface INewer {…}

[Guid(…)]
public interface NewNewer : INew {…}

[Guid(…)]
public class NewNewer : INew, INewer, NewNewer{
// Method implementation.
     [DispId(100)]…
}

البنيات

Structures defined within a نوع مكتبة are imported كـ بيانات التعريف. If a حقل of a بنية هو a مرجع نوع, Tlbimp.exe imports the نوع كـ an IntPtr و applies the ComConversionLossAttribute. The سمة indicates that معلومات was lost during the استيراد عملية.

عمليات التعداد

نوع مكتبة Importer (Tlbimp.exe) imports unmanaged enumerations كـ مدارة Enum أنواع.

الثوابت

Constants will not be imported من نوع مكتبة في this يطرح المنتج.

Typedefs

نوع ملفات تعريف (typedefs) within a نوع مكتبة are not imported. Instead, معلمات و حقول are imported كـ the underlying أنواع. For مثال, a معلمة of نوع BUTTON_COLOR هو imported كـ نوع عدد صحيح, since BUTTON_COLOR هو an اسم مستعار for an عدد صحيح.

Once imported, معلمات و حقول carry معلومات that associates them مع their الأصلي نوع في the ComAliasNameAttribute. The تحويل عملية applies ComAliasNameAttribute إلى associate a حقل, معلمة, أو return القيمة مع the name of the نوع مكتبة و the نوع within the مكتبة that was used كـ an اسم مستعار.

The following نوع مكتبة representation shows that the cl معلمة هو typed كـ a BUTTON_COLOR, which هو an اسم مستعار for an عدد صحيح.

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

library MyLib {
    typedef [public] int BUTTON_COLOR;

    interface ISee {
        HResult SetColor([in] BUTTON_COLOR cl);
        HResult GetColor([out, retval] BUTTON_COLOR *cl);
    };
   
    coclass See {
        [default] interface ISee
    };
};

The محول أنواع appear كـ follows:

public interface ISee {
    void SetColor([ComAliasName("MyLib.BUTTON_COLOR")]] int cl);
    [return: ComAliasName("MyLib.BUTTON_COLOR")] int GetColor();
};

public class See {
    public void SetColor([ComAliasName("MyLib.BUTTON_COLOR")]] int cl);
    [return: ComAliasName("MyLib.BUTTON_COLOR")] int GetColor();
};

ملاحظة that the الفعلي نوع BUTTON_COLOR ليس defined في the resulting بيانات التعريف. Instead, the معلمات typed كـ BUTTON_COLOR في the نوع مكتبة are typed كـ the underlying نوع, int, و are attributed مع the ComAliasNameAttribute. This تحويل عملية also applies the سمة إلى الوسيطات تشغيل فئة وظائف.

راجع أيضًا:

المبادئ

تحويل مكتبة المستوردة

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

تحويل عضو المستوردة

تحويل معلمة التي تم استيرادها

موارد أخرى

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