استخدام PInvoke) C++ Interop الضمني )

بعكس لغات .NET أخرى، يدعم ++Visual C التشغيل المتداخل الذي يسمح للتعليمات البرمجية المدارة و الغير المدارة بالتواجد في نفس التطبيق بل و في نفس الملف (مع managed, unmanaged pragmas). يسمح هذا لمطوري ++Visual C بـإدخال وظائف NET. في تطبيقات ++Visual C الموجودة دون إرباك باقي التطبيق.

يمكنك أيضاً استدعاء الدوال غير المُدارة من مدخل تحويل برمجي (compiland) مدار باستخدام dllexport, dllimport.

PInvoke الضمني مفيد عندما لا تحتاج إلى تحديد كيفية تنظيم معلمات دالة، أو أي من التفاصيل الأخري التي يمكن أن يتم تعيينهـا عند استدعاء DllImportAttribute بشكل صريح.

يوفر ++Visual C طريقتان للوظائف المدارة و الغير المدارة لتتفاعل:

يدعم NET Framework. الـ PInvoke الصريحة و تتوفر في معظم اللغات NET. ولكن كما يدل اسمه، فإن ++Interop C مخصصة لـ ++Visual C.

C++ Interop

يفضل استخدام ++Interop C بدلا من PInvoke الصريحة لأن ذلك يوفر أمان أفضل للنوع ، و هو عادةً أقل مشقة لتنفيذه ، و هو أكثر تسامحا إذا تم تعديل API الغير المدار و يجعل التحسينات في الأداء ممكنة و التي ليست ممكنة في PInvoke الصريحة. ومع ذلك، ++Interop C ليس من الممكن إذا لم تتوفر التعليمات البرمجية غير المُدارة المصدر أو عند التحويل برمجيا بواسطة /clr:safe (راجع تعليمة برمجية خالصة و قابلة للتحقق للحصول على مزيد من المعلومات).

C++ COM Interop

تقدم ميزات إمكانية التشغيل المتداخل المعتمدة من قبل ++Visual C ميزة معينة عن لغات NET. الأخرى عندما يتعلق الأمر بالتشغيل المتداخل لمكونات COM . بدلاً من أن تكون مقصورة على قيود Tlbimp.exe (مستورد مكتبة الأنواع) الخاصة بـ .NET Framework مثل الدعم المحدود لأنواع البيانات و العرض الإلزامي لكل عضو في كل واجهة COM ، تسمح ++Interop C لمكونات COM أن يتم الوصول إليها حسب الحاجة و لا يتطلب تجميعات interop منفصلة. لمزيد من المعلومات، راجع تستخدم ملقمات COM الأصلي من .NET.

الأنواع المشتركة

لـ API الغير المدارة التي تستخدم الأنواع البسيطة المضمنة (راجع Blittable وأنوع Blittable ) ، لا ترميز خاص مطلوب لأن هذه الأنواع لديهـا نفس التمثيل في الذاكرة ولكن الأنواع المركبة بشكل أكبر تتطلب تنظيم و إرسال صريحين للبيانات . على سبيل المثال ، راجع كيفية القيام بما يلي: استدعاء DLLs أصلية من تعليمات برمجية مُدارة بـاستخدام PInvoke.

مثال

// vcmcppv2_impl_dllimp.cpp
// compile with: /clr:pure user32.lib
using namespace System::Runtime::InteropServices;

// Implicit DLLImport specifying calling convention
extern "C" int __stdcall MessageBeep(int);

// explicit DLLImport needed here to use P/Invoke marshalling because
// System::String ^ is not the type of the first parameter to printf
[DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl,  CharSet = CharSet::Ansi)]
// or just
// [DllImport("msvcrt.dll")]
int printf(System::String ^, ...); 

int main() {
   // (string literals are System::String by default)
   printf("Begin beep\n");
   MessageBeep(100000);
   printf("Done\n");
}

Begin beep Done 

في هذا القسم

للحصول على معلومات حول استخدام التفويضات في سيناريو التوافق (interop) راجع delegate.

راجع أيضًا:

المبادئ

استدعاء الدالات الأصلية من التعليمات البرمجية المُدارة