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

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

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

هذه السلسلة

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

المحتويات

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

  • هذه السلسلة
  • المحتويات
  • نظرة خاطفة
  • مقدمة
  • صور التعاملية
  • التعاملية بين لغات الدوت نت
  • خاتمة
  • ماذا بعد

نظرة خاطفة

في الدرس السابق تعرفنا على التعاملية Interoperability في بيئة الدوت نت. في هذا الدرس نتعرف على صورة من صورها وهي التعاملية بين لغات الدوت نت.

مقدمة

كتذكرة، التعاملية Interoperability هي قابلية نظامين مختلفين للتواصل. وفي بيئة الدوت نت، نقصد دائما بالنظام الأول تطبيقات الدوت نت، أما النظام الثاني فيمكن أن يكون أي تقنية أخرى.

في هذا الدرس نتعرف على صور التعاملية، ونتكلم بتفصيل عن النوع الأول وهو تعاملية الكود المدار.

هيا بنا!

صور التعاملية

يمكننا القول أن للتعاملية Interop في بيئة الدوت نت نوعان:

  1. التعاملية بين لغات الدوت نت.
  2. التعاملية بين بيئة الدوت نت والتقنيات الأخرى.

وفيما يلي نبذة عن كل نوع.

التعاملية بين لغات الدوت نت

التعاملية بين لغات الدوت نت وتسمى أيضا التعاملية المدارة Managed Interop (نظرا لأن كود الدوت نت يسمى الكود المدار Managed Code في موضوع آخر بإذن الله نشرح هذا المفهوم.) وهذه إحدى المميزات أو الأهداف التي قامت عليها بيئة الدوت نت، وهي توفير طريقة أو أسلوب يمكن من خلاله دمج أكثر من تطبيق بلغات برمجية مختلفة (بالطبع كلها قائمة على الدوت نت) في مشروع واحد.

لتجربة ذلك اتبع معي الخطوات التالية:

  1. قم بإنشاء تطبيق جديد في الفيجوال ستوديو بلغتك المفضلة (سي شارب أو فيجوال بيزك مثلا) تطبيق مثلا لموجه الأوامر Console.
  2. قم بإضافة تطبيق آخر إلى نفس المشروع يكون مثلا لمكتبة Class Library بلغة أخرى غير التي اخترتها في المشروع الأول.

    شكل 1 - إضافة مرجع لمشروع

    شكل 1 - إضافة مرجع لمشروع

  3. في تطبيق المكتبة، قم بإضافة الكود التالي (انتقي اللغة المناسبة):
    // C#
    public static class Hello
    {
        public static string SayHello(string name)
        {
            return "مرحبا، " + name;
        }
    }
    ' VB.NET
    Public Module Hello
        Public Function SayHello(ByVal name As String) As String
            Return "مرحبا، " & name
        End Function
    End Module
  4. الآن عودة إلى التطبيق الأول. سوف نحاول النداء على الدالة التي قمنا بإنشائها في تطبيق المكتبة. أولا، يجب علينا إضافة مرجع إلى تطبيق المكتبة. في التطبيق الأول، تطبيق موجه الأوامر، قم بالضغط بزر الفأرة الأيمن على التطبيق في متصفح المشاريع Solution Explorer ثم اختر Add Reference. ومن هناك انتقل إلى تبويب Projects وأضف مشروعك (راجع شكل 1.)
  5. الآن وبعض إضافة المرجع وربط المكتبة بالمشروع، قم بإضافة الأكواد اللازمة (انتقي اللغة المناسبة أيضا) لإتمام وتنفيذ التعاملية Interop بين المشروعين مختلفي لغة البرمجة:
    // C#
    static void Main()
    {
        Console.WriteLine(ClassLibrary1.Hello.SayHello("محمد الشيمي"));
    }
    ' VB.NET
    Sub Main()
        Console.WriteLine(ClassLibrary1.Hello.SayHello("محمد الشيمي"))
    End Sub

هل لاحظت كيف تمت عملية الربط بأسهل ما يمكن؟ هذه هي الصورة الأولى للتعاملية في بيئة الدوت نت. ولكن، هنا يظهر سؤال هام، كيف تمت هذه العملية بهذه السهولة؟ كيف تم إمكان الربط بين تطبيقين أحدهما بالفيجوال بيزك والآخر بالسي شارب؟ هناك عدة تراكيب وأوامر في الفيجوال بيزك غير مدعومة في السي شارب والعكس أيضا؟!

الإجابة تكون في أحد أسرار الدوت نت وهي اللغة المتوسطة العامة Common Intermediate Language أو CIL. عند قيامك بتجميع Compile أي تطبيق من تطبيقاتك (باستخدام الأمر Build مثلا أو محاولة تشغيله) فإن المجمع Compiler لا يقوم مباشرة بتحويل الأكواد الخاصة بك إلى أوامر بلغة الآلة Machine Language يفهمها الجهاز كما يحدث مع أغلب المجمعات الخاصة بالتقينات الأخرى. بدلا من ذلك، يقوم المجمع بتحويل الأأكواد إلى أوامر باللغة المتوسطة CIL الخاصة بالدوت نت، ويقوم بتسجيلها في ملف التطبيق DLL أو EXE (انظر شكل 2.) ثم بعد ذلك وأثناء وقت التشغيل Runtime وبعد إتمام عمليات الربط ونحوها، يقوم المجمع بتحويل أكواد CIL إلى أكواد بلغة الآلة يفهمها الجهاز.

شكل 2 - اللغة العامة المتوسطة

شكل 2 - اللغة العامة المتوسطة

لهذا نستطيع فهم كيف أننا استطعنا من خلال برنامج بالسي شارب الوصول إلى التركيب Module الخاص بالفيجوال بيزك رغم أن السي شارب لا يدعم تركيبات الـ Module، وهذا لأن المجمع Compiler قام بتحويل هذا التركيب إلى تركيب عام خاص بلغة CIL وبالتالي أمكننا الربط بين الـ CIL الناتجة من السي شارب ونظيرتها الناتجة من الفيجوال بيزك، ولولا هذا ما أمكننا الربط أبدا.

وإذا اختلسنا النظر إلى كود CIL الناتج من أيا من مشروعي المكتبة (السي شارب أو الفيجوال بيزك) نجد أن الكود يكون كالتالي:

.class public abstract auto ansi sealed beforefieldinit ClassLibrary1.Hello
       extends [mscorlib]System.Object
{
    .method public hidebysig static string  SayHello(string name) cil managed
    {
      // Code size       12 (0xc)
      .maxstack  8
      IL_0000:  ldstr      "مرحبا، "
      IL_0005:  ldarg.0
      IL_0006:  call       string [mscorlib]System.String::Concat(string,
                                                              string)
      IL_000b:  ret
    } // end of method Hello::SayHello
} // end of class ClassLibrary1.Hello

بينما الكود الذي يقوم بالنداء على هذا الكود والناتج أيضا من أيا من مشروعي تطبيق موجه الأوامر (السي شارب أو الفيجوال بيزك) نجده كالتالي:

.class public abstract auto ansi sealed beforefieldinit ConsoleApplication1.Program
       extends [mscorlib]System.Object
{
    .method private hidebysig static void  Main() cil managed
    {
      .entrypoint
      .maxstack  8
      IL_0000:  ldstr      "محمد الشيمي"
      IL_0005:  call       string [ClassLibrary1]ClassLibrary1.Hello::SayHello(string)
      IL_000a:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_000f:  ret
    } // end of method Program::Main
} // end of class ConsoleApplication1.Program

يمكنك مشاهدة أكواد CIL عن طريق الأداة ILDasm.exe والتي تأتي مع الدوت نت وتوجد في Program Files\Microsoft SDKs\Windows\<version>\bin.

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

خاتمة

إذا فالسر خلف التعاملية بين لغات الدوت نت يكمن في اللغة المتوسطة العامة Common Intermediate Language أو CIL. عندما تقوم بتجميع Compile لمشروعك، يقوم المجمع Compiler بتحويل كود الدوت نت الخاص بك إلى كود CIL، ومن هناك تبدأ عملية الربط. لذلك فلا مشكلة من وجود تركيبات في لغة غير مدعومة في لغة أخرى، حيث أنها كلها تحول إلى تركيبات CIL يتم الاتصال من خلالها. أما أثناء وقت التشغيل Runtime فيقوم المجمع بتحويل كود الـ CIL إلى كود بلغة الآلة كي يفهمها الجهاز.

في الدرس المقبل سنتعلم ما هي التعاملية مع التقنيات الأخرى غير الدوت نت.

ماذا بعد

اقرأ أيضا من هذه السلسلة:

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

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

اخترنا لك:

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

هل أعجبتك؟ شارك بها...
  • Pingback: لقطات عن التعاملية Interoperability في بيئة الدوت نت 1 – المفهوم | مع الدوت نت()

  • H Wasef

    Hello Mohamed , what a great course
    but i’ve a note
    The CIL can form a great Danger on our software
    as it become possible to extract the Source Code of the Software by using tools like Reflectors
    that convert the CLR to the Source Code
    My Regards

    • بالطبع، لكن مايكروسوفت نفسها فشلت في حماية مكوناتها، ألا ترى أنك بأدوات بسيطة مثل Reflector أو حتى ILDasm تستطيع الحصول على 90 بالمائة من الأكواد لبيئة الدوت نت؟

      هناك أدوات يمكنها حماية أكوادك، ولكنها ستسبب بطء شديد للتطبيقات، ولهذا لا يفضل استخدامها ما لم تكن هناك حاجة ملحة لذلك.

      في النهاية نقول، أن كود الدوت نت هو كود عالي المستوى high-level وهو كود مدار Managed Code تتحكم فيه الـ CLR بالكامل ولا يمكنك الاعتماد عليه في تطوير تطبيقات معقدة تحتاج إلى هذا القدر من التأمين. وإذا كانت هناك بيانات سرية، فالأفضل بالطبع في كل الأحوال تشفيرها.

  • H Wasef

    This isn’t underestimating the importance of CLR

  • mhmoud

    شكرااااااااااااااااااااااااا

  • Pingback: لقطات عن التعاملية Interoperability في بيئة الدوت نت 3 – تعاملية الكود الغير المدار | مع الدوت نت()