This article is available in English too, check it out here.
اقرأ مواضيع أخرى مفصلة عن موضوع التعاملية.
هذه السلسلة
من هذه السلسلة:
- لقطات عن التعاملية Interoperability في بيئة الدوت نت 1 – المقدمة
- لقطات عن التعاملية Interoperability في بيئة الدوت نت 2 – تعاملية الكود المدار
- لقطات عن التعاملية Interoperability في بيئة الدوت نت 3 – تعاملية الكود الغير مدار
- شرح فيديو
المحتويات
محتويات هذا الموضوع:
- هذه السلسلة
- المحتويات
- نظرة خاطفة
- مقدمة
- صور التعاملية
- التعاملية بين لغات الدوت نت
- خاتمة
- ماذا بعد
نظرة خاطفة
في الدرس السابق تعرفنا على التعاملية Interoperability في بيئة الدوت نت. في هذا الدرس نتعرف على صورة من صورها وهي التعاملية بين لغات الدوت نت.
مقدمة
كتذكرة، التعاملية Interoperability هي قابلية نظامين مختلفين للتواصل. وفي بيئة الدوت نت، نقصد دائما بالنظام الأول تطبيقات الدوت نت، أما النظام الثاني فيمكن أن يكون أي تقنية أخرى.
في هذا الدرس نتعرف على صور التعاملية، ونتكلم بتفصيل عن النوع الأول وهو تعاملية الكود المدار.
هيا بنا!
صور التعاملية
يمكننا القول أن للتعاملية Interop في بيئة الدوت نت نوعان:
- التعاملية بين لغات الدوت نت.
- التعاملية بين بيئة الدوت نت والتقنيات الأخرى.
وفيما يلي نبذة عن كل نوع.
التعاملية بين لغات الدوت نت
التعاملية بين لغات الدوت نت وتسمى أيضا التعاملية المدارة Managed Interop (نظرا لأن كود الدوت نت يسمى الكود المدار Managed Code في موضوع آخر بإذن الله نشرح هذا المفهوم.) وهذه إحدى المميزات أو الأهداف التي قامت عليها بيئة الدوت نت، وهي توفير طريقة أو أسلوب يمكن من خلاله دمج أكثر من تطبيق بلغات برمجية مختلفة (بالطبع كلها قائمة على الدوت نت) في مشروع واحد.
لتجربة ذلك اتبع معي الخطوات التالية:
- قم بإنشاء تطبيق جديد في الفيجوال ستوديو بلغتك المفضلة (سي شارب أو فيجوال بيزك مثلا) تطبيق مثلا لموجه الأوامر Console.
- قم بإضافة تطبيق آخر إلى نفس المشروع يكون مثلا لمكتبة Class Library بلغة أخرى غير التي اخترتها في المشروع الأول.
- في تطبيق المكتبة، قم بإضافة الكود التالي (انتقي اللغة المناسبة):
// 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
- الآن عودة إلى التطبيق الأول. سوف نحاول النداء على الدالة التي قمنا بإنشائها في تطبيق المكتبة. أولا، يجب علينا إضافة مرجع إلى تطبيق المكتبة. في التطبيق الأول، تطبيق موجه الأوامر، قم بالضغط بزر الفأرة الأيمن على التطبيق في متصفح المشاريع Solution Explorer ثم اختر Add Reference. ومن هناك انتقل إلى تبويب Projects وأضف مشروعك (راجع شكل 1.)
- الآن وبعض إضافة المرجع وربط المكتبة بالمشروع، قم بإضافة الأكواد اللازمة (انتقي اللغة المناسبة أيضا) لإتمام وتنفيذ التعاملية 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 إلى أكواد بلغة الآلة يفهمها الجهاز.
لهذا نستطيع فهم كيف أننا استطعنا من خلال برنامج بالسي شارب الوصول إلى التركيب 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 FilesMicrosoft SDKsWindows<version>bin.
إلى الآن، تعرفنا على الصورة الأولى للتعاملين بين لغات الدوت نت. الصورة الثانية معنا هي التعاملية بين الدوت نت ككل والتقنيات الأخرى.
خاتمة
إذا فالسر خلف التعاملية بين لغات الدوت نت يكمن في اللغة المتوسطة العامة Common Intermediate Language أو CIL. عندما تقوم بتجميع Compile لمشروعك، يقوم المجمع Compiler بتحويل كود الدوت نت الخاص بك إلى كود CIL، ومن هناك تبدأ عملية الربط. لذلك فلا مشكلة من وجود تركيبات في لغة غير مدعومة في لغة أخرى، حيث أنها كلها تحول إلى تركيبات CIL يتم الاتصال من خلالها. أما أثناء وقت التشغيل Runtime فيقوم المجمع بتحويل كود الـ CIL إلى كود بلغة الآلة كي يفهمها الجهاز.
في الدرس المقبل سنتعلم ما هي التعاملية مع التقنيات الأخرى غير الدوت نت.
ماذا بعد
اقرأ أيضا من هذه السلسلة:
- لقطات عن التعاملية Interoperability في بيئة الدوت نت 1 – المقدمة
- لقطات عن التعاملية Interoperability في بيئة الدوت نت 2 – تعاملية الكود المدار
- لقطات عن التعاملية Interoperability في بيئة الدوت نت 3 – تعاملية الكود الغير مدار
- شرح فيديو
اقرأ مواضيع مفصلة عن موضوع التعاملية.
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 بالكامل ولا يمكنك الاعتماد عليه في تطوير تطبيقات معقدة تحتاج إلى هذا القدر من التأمين. وإذا كانت هناك بيانات سرية، فالأفضل بالطبع في كل الأحوال تشفيرها.
إعجابإعجاب
This isn’t underestimating the importance of CLR
إعجابإعجاب
شكرااااااااااااااااااااااااا
إعجابإعجاب