لقطات عن التعاملية Interoperability في بيئة الدوت نت 3 – تعاملية الكود الغير المدار

This article is available in English too, check it out here.

اقرأ مواضيع أخرى مفصلة عن التعاملية.

هذه السلسلة

من هذه السلسلة:

المحتويات

محتويات هذا الموضوع:

  • هذه السلسلة
  • المحتويات
  • نظرة خاطفة
  • مقدمة
  • التعاملية بين بيئة الدوت نت والتقنيات الأخرى
  • التعاملية مع المكتبات المحلية
  • التعاملية مع مكونات COM
  • التعاملية مع أدوات ActiveX
  • خاتمة
  • ماذا بعد

نظرة خاطفة

هذا هو الدرس الأخير في هذه السلسلة. درسنا اليوم يتكلم عن التعاملية بين بيئة الدوت نت والتقنيات الأخرى التي يطلق عليها الكود الغير مدار. في هذا الدرس سنستعرض العديد والعديد من الأفكار والتطبيقات، تابعونا!

مقدمة

ربما أن التعاملية بين لغات الدوت نت ليست مثيرة بالشكل الكافي، ولكن التعاملية بين الدوت نت والتقنيات الأخرى ليست كذلك. ورغم صعوبتها، إلا أنك تستطيع من خلالها حل العديد والعديد من المشكلات واختصار وقت طويل في إعادة تطوير هذه المكونات.

التعاملية بين الدوت نت والتقنيات الأخرى

ربما لا تجد تقنية التعاملية بين لغات الدوت نت مثيرة أو تحتاج إلى الدراسة، ولكن التعاملية بين تطبيقات الدوت نت بشكل عام والتطبيقات القائمة على تقنيات أخرى ليست بهذه السهولة أبدا! وهذه التقنية تسمى التعاملية الغير مدارة Unmanaged Interoperability وذلك لأن الأكواد عدا الدوت نت نسميها أكواد غير مدارة Unmanaged Code (سوف نتعرف إلى هذا المصطلح فيما بعد في درس آخر بإذن الله تعالى.)

وهذه الصورة من صور التعاملية لها نماذج تأتي فيها:

  1. التعاملية بين بيئة الدوت نت والمكتبات المحلية.
  2. التعاملية بين بيئة الدوت نت ومكونات COM.
  3. التعاملية بين بيئة الدوت نت وأدوات آكتيف إكس ActiveX.

التعاملية مع المكتبات المحلية

وتشمل واجهة برمجة النظام والمكتبات المحلية Native Libraries التي يتم تطويرها باستخدام مثلا C++ أو C، وتعتمد على واجهة برمجة النظام وتحوي أكواد محلية يمكنها العمل مباشرة على نظام التشغيل بدون الحاجة إلى مترجم Compiler، وتسمى أيضا نداءات النظام Platform Invocation (تختصر إلى PInvoke) وذلك لأنها عبارة عن مجموعة ضخمة من الدوال في الغالب لا تخضع لسياسات البرمجة الموجهة للكائنات OOP، وأنت ببساطة تقوم بالنداء على هذه الدوال.

ولكي تستطيع التعامل مع دوال النظام في الدوت نت، يجب عليك تعريف كل دالة تريد استخدامها في الكود الخاص بك، ويشمل التعريف البيانات التالية:

  1. المكتبة التي توجد بها الدالة.
  2. اسم الدالة.
  3. القيمة المرتجعة من الدالة.
  4. المدخلات للدالة.

وهنا يظهر سؤال مهم جدا، هناك العديد من الأنواع الموجودة في الواجهة البرمجية للنظام والتي لا يوجد مثيل لها في الدوت نت. فمثلا، بيئة الدوت نت لا تحوي BOOL أو LPCTSTR ونحوها، فما الحل؟ الحل هو في عملية الترجمة Marshaling.

الترجمة Marshaling هي عملية تحدث أثناء الاتصال بين بيئة الدوت نت وأي تقنية أخرى يتم فيها إيجاد بدائل للأنواع والتركيبات الموجودة في التقنية الأخرى الغير متواجدة في بيئة الدوت نت.

فمثلا، يمكننا ترجمة BOOL إلى System.Boolean، وأيضا LPCTSTR إلى System.String أو ربما System.Text.StringBuilder إذا أحببت.

شكل 1 - عملية الترجمة Marshaling

شكل 1 - عملية الترجمة Marshaling

ولكي تفهم أكثر عملية نداء النظام Platform Invokation، معنا أحد الأمثلة وهو عبارة عن كود يقوم بالتبديل بين وظائف أزرار الفأرة، فيصبح الزر الأيمن يعمل عمل الأيسر والعكس بالعكس.

يتم ذلك عن طريق دالة بسيطة جدا في واجهة النظام في المكتبة user32.dll وتسمى SwapMouseButtons() ولها التعريف التالي:

BOOL SwapMouseButton(
    BOOL fSwap
    );

بالطبع، كي تستطيع النداء على هذه الدالة يجب عليك تعريفها في بيئة الدوت نت، ويكون التعريف كالتالي:

// C#
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern bool SwapMouseButton(bool fSwap);
' VB.NET
Declare Auto Function SwapMouseButton Lib "user32.dll" _
    (ByVal fSwap As Boolean) As Boolean

لاحظ أننا قمنا بترجمة BOOL إلى System.Boolean. أيضا لاحظ استخدام الصفة DllImportAttribute في كود السي شارب لتحديد مكتبة الويندوز، بينما قمنا بتحديد المكتبة مباشرة في الفيجوال بيزك.

والآن هذا هو الكود الذي يقوم بالنداء على هذه الدالة وتبديل زري الفأرة.

// C#
public void MakeRightButtonPrimary()
{
    SwapMouseButton(true);
}
public void MakeLeftButtonPrimary()
{
    SwapMouseButton(false);
}
' VB.NET
Public Sub MakeRightButtonPrimary()
    SwapMouseButton(True)
End Sub
Public Sub MakeLeftButtonPrimary()
    SwapMouseButton(False)
End Sub

التعاملية مع مكونات COM

مكونات COM مثل هذه التي تم تطويرها باستخدام الفيجوال بيزك 6، هي أيضا التقنيات التي يمكننا التعامل معها برمجيا بسهولة من خلال بيئة الدوت نت باستخدام تقنية، التعاملية Interoperability.

ببساطة، كل ما عليك فعله هو إضافة مرجع لمكون COM من خلال شاشة Add Reference تبويب COM، حينها يقوم الفيجوال ستوديو بإضافة مكتبة الـ COM إلى مشروعك، بالإضافة إلى مكتبة أخرى عبارة عن مكتبة دوت نت تعمل كوكيل Proxy بين تطبيق الدوت نت الخاص بك ومكتبة الـ COM، حيث أنك بالتأكيد لا تستطيع إنشاء اتصال مباشر مع مكتبة الـ COM. لاحظ أنه في فيجوال ستوديو 2010 (الدوت نت 4) والإصدارات الأعلى، يقوم الفيجوال بدمج مكتبة الوكيل Proxy مع مكتبة COM الأصلية في مكتبة واحدة، وهذا خيار مفعل تلقائيا مالم تقوم بتغيير خاصية الدمج Embed Interop Types من خصائص المرجع.

مكتبة الوكيل Proxy تسمى أيضا مكتبة التعاملية الرئيسية Primary Interop Assembly (أو PIA)، كما تسمى أيضا Runtime Callable Wrapper (أو RCW.)

في المثال التالي نقوم بإنشاء برنامج بسيط يقوم بقراءة الكلمات. اتبع الخطوات التالية:

  1. قم بإنشاء مشروع جديد لموجه أوامر Console مثلا.
  2. قم بفتح شاشة إضافة مرجع Add Reference ومن تبويب COM ابحث عن المكتبة الخاصة بالتحدث وهي Microsoft Speech Object Library ثم أضفها (انظر شكل 3.)

    شكل 2 - إضافة مرجع لمكتبة التحدث SpeechLib

    شكل 2 - إضافة مرجع لمكتبة التحدث SpeechLib

  3. الآن قم بكتابة الأكواد والتجربة:
    // C#
    using SpeechLib;
    static void Main()
    {
        Console.WriteLine("Enter the text to read:");
        string txt = Console.ReadLine();
        Speak(txt);
    }
    static void Speak(string text)
    {
        SpVoice voice = new SpVoiceClass();
        voice.Speak(text, SpeechVoiceSpeakFlags.SVSFDefault);
    }
    ' VB.NET
    Imports SpeechLib
    Sub Main()
        Console.WriteLine("Enter the text to read:")
        Dim txt As String = Console.ReadLine()
        Speak(txt)
    End Sub
    Sub Speak(ByVal text As String)
        Dim voice As New SpVoiceClass()
        voice.Speak(text, SpeechVoiceSpeakFlags.SVSFDefault)
    End Sub

إذا لم يعمل الكود السابق نظرا لمشكلة في المكتبة تمنع الفيجوال ستويدو من عمل تجميع لتطبيقك، فننصحك لإلغاء خاصية Embed Interop Types من خصائص المرجع SpeechLib.dll.

التعاملية مع أدوات ActiveX

أدوات آكتيف إكس ActiveX كما تعرف ليست إلا مكونات COM، غير أنها عبارة عن أدوات يمكن إضافتها إلى النافذة. يمكنك إضافة أداة أكتيف إكس عن طريق الذهاب إلى لوحة الأدوات Toolbox والضغط بزر الفأرة الأيمن واختيار Choose Toolbox Items لتظهر لك نافذة اختيار الأدوات الموضحة في شكل 4. قم بالانتقال في هذه النافذة إلى تبويب COM Components ومن ثم اختيار الأدوات التي تريد إضافتها.

شكل 3 - إضافة أداة الـ Windows Media Player إلى المشروع

شكل 3 - إضافة أداة الـ Windows Media Player إلى المشروع

طريقة أخرى لإنشاء العميل Proxy الخاص بالمكون باستخدام أداة موجه الأوامر aximp.exe والتي يمكنك إيجادها في Program Files\Microsoft SDKs\Windows\v7.0A\bin. يمكنك استخدام هذه الأداة بكتابة سطر كالتالي:

aximp.exe "C:\Windows\System32\wmp.dll"

وهذا يقوم بإنشاء مكتبة العميل Proxy ووضعها في نفس مجلد الأداة. وهنا يمكنك إضافة مرجع إلى هذه المكتبة والبدأ باستخدامها.

خاتمة

نلخص كل ما سبق في أنه يمكن لبيئة الدوت نت الاتصال مع تقنيات أخرى منها المكتبات المحلية وواجهة برمجة النظام وأيضا مكونات COM وأدوات ActiveX. للاتصال مع واجهة برمجة النظام أو المكتبات المحلية تحتاج إلى معرفة بعض البيانات، مثل المكتبة التي تحوي هذه الدالة، القيمة المرتجعة من الدالة، والمدخلات للدالة، وتسمى عملية النداء هذه نداءات النظام Platform Invocation. أما COM و ActiveX فيفضل استخدامك للفيجوال ستوديو لإضافة المكونات إلى مشروعك. ويقوم الفيجوال ستوديو بإضافة مكتبة وكيل Proxy يعمل كوسيط بين كود الدوت نت والمكون الأصلي وبالتالي توفير بيئة صالحة للتعامل.

ماذا بعد

من هذه السلسلة:

اقرأ مواضيع مفصلة عن موضوع التعاملية.

مواضيع مشابهة:

اخترنا لك:

أحدث المواضيع:

هل أعجبتك؟ شارك بها...