03-10-12, 01:59 PM
كاتب الموضوع : أبو يعقوب
السلام عليكم ورحمة الله وبركاتهاليوم وأنا غارق في التفكير ببرنامجي القادم كانت احدى خططي هي جعل برنامجي قابل للتمدد (يعني قابل للتعديل حتى بعد بناء الملف التنفيذي له)
بحثت في Google ووصلت إلى مرادي في إحدى المدونات الأجنبية
الفكرة تتلخص في التالي
بناء واجهة لتكون حلقة الوصل بين التطبيق المضيف والمضاف (Plug-In)
نأتي الآن التطبيق:
سنقوم بإنشاء مشروع من نوع Windows Application
وليكن اسمه : PlugInHost ....... وهذا هو التطبيق الذي نريد تمديده
سننشئ مشروع اخر في نفس ال Solution (أفترض ان من يحتاج الى صناعة نظام قابل للتمدد ان يعرف كيف يفعلها J ) من نوع Class Library
وليكن اسمه : PlugIn ........ وهو الاضافة الى التطبيق
والآن ننشئ المشروع الاهم ( في نفس Solution ) من نوع Class Library وهو حلقة الوصل بين المشروعين السابقين
وليكن اسمه : PlugInLinker
الآن أول ما نبدأ به هو المشروع الثالث وسنقوم بإنشاء واجهة Interface (مجرد مثال) تحتوي على اجراء ShowMessage
ليكن اسمها مثلاً : IPlugIn
كود :
[color=#000000][COLOR=#007700]Public Interface [/color][COLOR=#0000bb]IPlugIn
Sub ShowMessage[/COLOR][color=#007700]([/color][color=#0000bb]ByVal text [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]Interface
[/COLOR][/COLOR]
إحفظ ملفات هذا المشروع ونقوم بإضافته كمرجع Refrence للتطبيقين الآخرين
===============================
الآن نقوم ببناء فئئة Classداخل المشروع PlugIn ونضمن الواجهة بداخلها
وليكن اسمها مثلاً : PlugInClass
كود :
[color=#000000][COLOR=#007700]Public Class [/color][COLOR=#0000bb]PlugInClass
[/COLOR][color=#007700]Implements [/color][COLOR=#0000bb]IPlugIn
[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub ShowMessage[/color][color=#007700]([/color][color=#0000bb]ByVal text [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]) Implements [/color][color=#0000bb]PlugInLink[/color][color=#007700].[/color][color=#0000bb]IPlugIn[/color][color=#007700].[/color][COLOR=#0000bb]ShowMessage
MsgBox[/COLOR][color=#007700]([/color][color=#0000bb]text[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]End Sub
End [/COLOR][COLOR=#007700]Class
[/COLOR][/COLOR]
ونحفظ هذا المشروع
الآن طريقة ربط ال Plug-In مع التطبيق الاساسي
دبل كلك على Form1
الآن سنقوم ببناء دالة لتحميل Plug-In (في وقت التنفيذ)
كود :
[color=#000000][COLOR=#007700]Function [/color][color=#0000bb]LoadPlugIn[/color][color=#007700]([/color][color=#0000bb]ByVal PlugInFile [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]) As [/color][COLOR=#0000bb]IPlugIn
[/COLOR][COLOR=#007700]Try
[/COLOR][COLOR=#dd0000]'تحميل ملف ال plug-in داخل فئة من نوع assembly
Dim PlugInAssembly As Reflection.Assembly = Reflection.Assembly.LoadFrom(PlugInFile)
Dim PlugInClass As IPlugIn
Dim Types() As Type
Dim FoundInterface As Type
'[/COLOR][COLOR=#0000bb]للحصول على كل الانواع المعرفة داخل المجمع
Types [/COLOR][color=#007700]= [/color][color=#0000bb]PlugInAssembly[/color][color=#007700].[/color][COLOR=#0000bb]GetTypes
حلقة تكرارية للبحث عن الفئة التي تحقق الواجهة المشتركة IPlugIn
[/COLOR][color=#007700]For [/color][color=#0000bb]Each PlugInType [/color][color=#007700]As [/color][COLOR=#0000bb]Type In Types
FoundInterface [/COLOR][color=#007700]= [/color][color=#0000bb]PlugInType[/color][color=#007700].[/color][color=#0000bb]GetInterface[/color][color=#007700]([/color][color=#0000bb]GetType[/color][color=#007700]([/color][color=#0000bb]IPlugIn[/color][color=#007700]).[/color][color=#0000bb]FullName[/color][COLOR=#007700])
If [/COLOR][COLOR=#0000bb]FoundInterface IsNot Nothing Then
PlugInClass [/COLOR][color=#007700]= [/color][color=#0000bb]DirectCast[/color][color=#007700]([/color][color=#0000bb]PlugInAssembly[/color][color=#007700].[/color][color=#0000bb]CreateInstance[/color][color=#007700]([/color][color=#0000bb]PlugInType[/color][color=#007700].[/color][color=#0000bb]FullName[/color][color=#007700]), [/color][color=#0000bb]IPlugIn[/color][COLOR=#007700])
Return [/COLOR][COLOR=#0000bb]PlugInClass
End [/COLOR][COLOR=#007700]If
[/COLOR][COLOR=#0000bb]Next
[/COLOR][color=#007700]Catch [/color][color=#0000bb]ex [/color][color=#007700]As [/color][COLOR=#0000bb]Exception
End [/COLOR][COLOR=#007700]Try
Return [/COLOR][COLOR=#0000bb]Nothing
End [/COLOR][COLOR=#007700]Function
[/COLOR][/COLOR]
والآن في حدث تحميل الفورم نقوم بتحميل المجمع plug-in
كود :
[color=#000000][COLOR=#0000bb]Dim PlugInPath [/color][color=#007700]As [/color][color=#0000bb]String [/color][color=#007700]= [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]Path[/color][color=#007700].[/color][color=#0000bb]GetDirectoryName[/color][color=#007700]([/color][color=#0000bb]Application[/color][color=#007700].[/color][color=#0000bb]ExecutablePath[/color][color=#007700]) & [/color][COLOR=#dd0000]"\PlugIn.dll"
[/COLOR][color=#0000bb]Dim PlugIn [/color][color=#007700]As [/color][color=#0000bb]IPlugIn [/color][color=#007700]= [/color][color=#0000bb]LoadPlugIn[/color][color=#007700]([/color][color=#0000bb]PlugInPath[/color][COLOR=#007700])
If [/COLOR][COLOR=#0000bb]PlugIn IsNot Nothing Then
PlugIn[/COLOR][color=#007700].[/color][color=#0000bb]ShowMessage[/color][color=#007700]([/color][color=#dd0000]" بنجاح Plug-In تم تحميل وتشغيل"[/color][COLOR=#007700])
Else
[/COLOR][color=#0000bb]MsgBox[/color][color=#007700]([/color][color=#dd0000]" Plug-In لم يتم تحميل "[/color][COLOR=#007700])
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
[/COLOR][/COLOR]
وهكذا انتهى الدرس المختصر جداص والذي ليس للمبتدئين (اتمنى يخيبوني J )
آمل انكم فهمتم الطريقة ... انا عن نفسي مبسوووط اوي اوي اوي لاني واخيرا عرفت اعمل plug-in لبرامجي المستقبلية والبرنامج القادم سيكون كذلك ان شاء الله
والآن ادركت فائدة إحدى الفوائد الحقيقية لاستخدام الواجهات
المصدر
http://vbnotebookfor.net/2007/10/09/...-ins-in-vbnet/