لقد عملت مؤخرًا على مشروع يستخدم ملف dll الخاص بـ vc، ولكن كان من الضروري استدعاؤه في .net، ودرست كيفية استدعاء ملف dll غير المُدار في لغة c#.
لنقدم أولاً ملف dll
1. ملف دي إل إل
تعد مكتبة الارتباط الديناميكي (وتسمى أيضًا DLL، وهي اختصار لـ "مكتبة الارتباط الديناميكي") أحد أهم مكونات نظام التشغيل Windows. افتح مجلد نظام Windows وستجد أن هناك العديد من ملفات DLL في المجلد Windows يتم تنفيذ وظائف النظام الرئيسية في شكل وحدات DLL.
لا يمكن تنفيذ مكتبة الارتباط الديناميكي مباشرة، ولا يمكنها استقبال الرسائل، فهي مجرد ملف مستقل يحتوي على وظائف (طرق) يمكن استدعاؤها بواسطة البرامج أو ملفات DLL الأخرى لإكمال عمليات معينة. ملاحظة: تسمى بشكل عام "الطرق" في لغة C#. ) ، لكن هذه الوظائف ليست جزءًا من برنامج التنفيذ نفسه، ولكن يتم تحميلها عند الطلب وفقًا لاحتياجات العملية، ويمكن أن تلعب دورًا فقط في هذا الوقت.
يتم تحميل DLL في المساحة الافتراضية للعملية بواسطة النظام فقط عندما يحتاج التطبيق إليها، ويصبح جزءًا من عملية الاستدعاء. في هذا الوقت، لا يمكن الوصول إلى DLL إلا من خلال مؤشر ترابط العملية، ويمكن لمقبضها ذلك يمكن استخدامه بواسطة عملية الاستدعاء، ويمكن أيضًا استخدام مقبض العملية بواسطة DLL. في الذاكرة، يحتوي ملف DLL على مثيل واحد فقط، ولا علاقة لإعداده بلغة البرمجة والمترجم المحددين، لذلك يمكن تحقيق برمجة اللغات المختلطة من خلال DLL. أي كائنات (بما في ذلك المتغيرات) تم إنشاؤها بواسطة التعليمات البرمجية داخل دالة DLL مملوكة للخيط أو العملية التي تستدعيها.
2. استدعاء DLL
كل لغة برمجة لها طرق مختلفة لاستدعاء DLL هنا نقدم فقط طريقة استدعاء DLL باستخدام C#. أولاً، عليك أن تفهم ما هو مُدار وما هو غير مُدار. بشكل عام، يمكن الاعتقاد بأن التعليمات البرمجية غير المُدارة هي بشكل أساسي مكونات DLL وactiveX التي تم تطويرها استنادًا إلى النظام الأساسي win 32، بينما تم تطوير التعليمات البرمجية المُدارة استنادًا إلى النظام الأساسي .net.
(1) الطريقة العامة لاستدعاء الوظائف غير المُدارة في DLL
أولاً يجب الإعلان عن الطريقة الخارجية في البرنامج المصدر للغة C# وشكلها الأساسي هو:
[DLLImport("ملف DLL")]
يقوم المُعدِّل extern بإرجاع اسم طريقة النوع المتغير (قائمة المعلمات)
في:
ملف DLL: يحتوي على ملف مكتبة يحدد الطرق الخارجية.
المعدلات: معدلات الوصول، ومعدلات أخرى غير الملخص التي يمكن استخدامها عند الإعلان عن الطرق.
نوع متغير الإرجاع: نوع متغير الإرجاع للطريقة التي تحتاج إلى استدعائها في ملف DLL.
اسم الأسلوب: اسم الأسلوب الذي تريد الاتصال به في ملف DLL.
قائمة المعلمات: قائمة الأساليب التي تحتاج إلى الاتصال بها في ملف DLL.
ملاحظة: يجب استخدام مساحة الاسم System.Runtime.InteropServices في إعلان البرنامج.
يمكن وضع DllImport فقط على إعلانات الطريقة.
يجب أن يكون ملف DLL موجودًا في الدليل الحالي للبرنامج أو في مسار الاستعلام المحدد بواسطة النظام (أي: المسار الذي يحدده المسار في متغير بيئة النظام).
يجب أن يكون نوع متغير الإرجاع واسم الأسلوب وقائمة المعلمات متسقًا مع التعريفات الموجودة في ملف DLL.
إذا كنت تريد استخدام أسماء وظائف أخرى، فيمكنك استخدام إعداد خاصية EntryPoint، مثل:
[DllImport("user32.dll"، EntryPoint="MessageBoxA")]
static extern int MsgBox(int hWnd, string msg, string caption, int type);
سمات DllImportAttribute الاختيارية الأخرى:
يشير CharSet إلى مجموعة الأحرف المستخدمة في نقطة الإدخال، مثل: CharSet=CharSet.Ansi;
يشير SetLastError إلى ما إذا كانت الطريقة تحتفظ بـ "الخطأ الأخير" لـ Win32، مثل: SetLastError=true;
يشير ExactSpelling إلى ما إذا كان يجب أن يتطابق EntryPoint تمامًا مع تهجئة نقطة الإدخال المشار إليها، مثل: ExactSpelling=false;
يشير PreserveSig إلى ما إذا كان يجب الاحتفاظ بتوقيع الطريقة أو تحويله، مثل: PreserveSig=true;
يشير CallingConvention إلى اصطلاح الاتصال الخاص بنقطة الإدخال، مثل: CallingConvention=CallingConvention.Winapi;