استخدام 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
في هذا القسم
كيفية القيام بما يلي: تنظيم سلاسل ANSI بـاستخدام C++ Interop
كيفية القيام بما يلي: تنظيم وإرسال سلاسل Unicode باستخدام C++ Interop
كيفية القيام بما يلي: تنظيم وإرسال بنيات باستخدام C++ Interop
كيفية القيام بما يلي: تنظيم وإرسال صفائف باستخدام C++ Interop
كيفية القيام بما يلي: تنظيم وإرسال عمليات الاسترجاع و المفوضين بـاستخدام C++ Interop
كيفية القيام بما يلي: تنظيم وارسال المؤشرات المضمنة بـاستخدام C++ Interop
كيفية القيام بما يلي: تحويل الحرف * String to System::Byte Array
كيفية القيام بما يلي: تحويل System::String إلى *wchar_t أو *char
كيفية القيام بما يلي: تحميل موارد غير مدارة في صفيف بايت(Byte)
كيفية القيام بما يلي: إضافة DLL أصلي لمخزن التجميع العمومي المؤقت
كيفية القيام بما يلي: الاحتفاظ بـمرجع لنوع قيمة في النوع الأصلي
كيفية القيام بما يلي: الاحتفاظ بمرجع الكائن في الذاكرة الغير المدارة
كيفية القيام بما يلي: التصريح بالمعالجات في الأنواع الأصلية
كيفية القيام بما يلي: التفاف الفئة الأصلية للاستخدام بواسطة C#
للحصول على معلومات حول استخدام التفويضات في سيناريو التوافق (interop) راجع delegate.