تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
كيفية صنع AddIn لبرنامجك و جعله يقبل اى AddIn
#1


سوف اشرح اليوم كيفية عمل AddIn لبرنامجك و جعله يقبل اى AddIn يصنعها المطورون (C# - VB.NET)

قم باعداد ثلاث مشاريع كما فى الصور و بعد ذلك سوف نكتب الأكواد. أتبع الصور


سنبدأ الأن بكتابة الأكواد

فى مشروع AddInManager الكلاس AddIn

VB:
PHP كود :
Public Interface AddIn

    
'اذا كنت تريد كتابة اى كود يستدعى فى ال Sub New
    Sub OnCreateAddIn()

    '
اذا كان برنامجك يحتوى على
    
'MenuStrip
    '
وتريد اضافة عنصر له
    Sub OnCreateMenuStrip
(menuStrip As Object)

    
'اذا كان برنامجك يحتوى على
    '
ToolStrip
    
'وتريد اضافة عنصر له
    Sub OnCreateToolStrip(toolStrip As Object)

    '
الفورم الرئيسى فى برنامجك
    Sub OnCreateMainForm
(form As Object)
End Interface 

C#:
PHP كود :
public interface AddIn
{

    
//اذا كنت تريد كتابة اى كود يستدعى فى ال Sub New

    
void OnCreateAddIn();
    
//اذا كان برنامجك يحتوى على
    //MenuStrip
    //وتريد اضافة عنصر له

    
void OnCreateMenuStrip(object menuStrip);
    
//اذا كان برنامجك يحتوى على
    //ToolStrip
    //وتريد اضافة عنصر له

    
void OnCreateToolStrip(object toolStrip);
    
//الفورم الرئيسى فى برنامجك
    
void OnCreateMainForm(object form);


عندما نصنع الأضافة سوف نعمل Implements من هذا ال Interface. لماذا؟

حتى تكون جميع ال AddIns التى ستصنع لبرنامجك بهذا الشكل او النظام حتى يستطيع برنامجك قراءة ال AddIn



فى المشروع AddInManager فى الكلاس AddInManager

VB:
PHP كود :
Imports System.Reflection

Public Class AddInManager

    
Public Shared Sub LoadAddIn(path As StringParamArray args As Object())
        
Dim AddIn As [Assembly] = [Assembly].LoadFrom(path)

        
Dim t As Type AddIn.GetType(AddIn.GetName.Name ".Main")

        
InvokeMethod(t"OnCreateAddIn"Nothing)

        
InvokeMethod(t"OnCreateMainForm", {args(0)})

        
InvokeMethod(t"OnCreateMenuStrip", {args(1)})

        
InvokeMethod(t"OnCreateToolStrip", {args(2)})
    
End Sub

    
Private Shared Sub InvokeMethod(As Typename As Stringargs() As Object)
        
Dim mtd As MethodInfo t.GetMethod(name)
        
Dim classInstance As Object Activator.CreateInstance(tTrue)
        
mtd.Invoke(classInstanceargs)
    
End Sub
End 
Class 


C#:
PHP كود :
using System.Reflection;

public class 
AddInManager
{

    public static 
void LoadAddIn(string pathparams object[] args)
    {
        
Assembly AddIn Assembly.LoadFrom(path);

        
Type t AddIn.GetType(AddIn.GetName.Name ".Main");

        
InvokeMethod(t"OnCreateAddIn"null);

        
InvokeMethod(t"OnCreateMainForm", new object[] { args(0) });

        
InvokeMethod(t"OnCreateMenuStrip", new object[] { args(1) });

        
InvokeMethod(t"OnCreateToolStrip", new object[] { args(2) });
    }

    private static 
void InvokeMethod(Type tstring nameobject[] args)
    {
        
MethodInfo mtd t.GetMethod(name);
        
object classInstance Activator.CreateInstance(ttrue);
        
mtd.Invoke(classInstanceargs);
    }




فى المشروع CalculatorAddIn فى الكلاس Main

VB:
PHP كود :
Imports AddInManager
Imports System
.Windows.Forms
Imports System
.Drawing

Public Class Main
    
Implements AddIn

    
Public Sub New()
        
OnCreateAddIn()
    
End Sub

    
Public Sub OnCreateAddIn() Implements AddIn.OnCreateAddIn
        Button1 
= New Button
        Label1 
= New Label
        ComboBox1 
= New ComboBox
        TextBox1 
= New TextBox
        TextBox2 
= New TextBox
        TextBox3 
= New TextBox
    End Sub

    
Public Sub OnCreateMainForm(form As Object) Implements AddIn.OnCreateMainForm
        
'
        '
Button1
        
'
        Me.Button1.Location = New Point(254, 56)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New Size(75, 23)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Calculate"
        Me.Button1.UseVisualStyleBackColor = True
        '
        'Label1
        '
        
Me.Label1.AutoSize True
        Me
.Label1.Location = New Point(20833)
        
Me.Label1.Name "Label1"
        
Me.Label1.Size = New Size(1513)
        
Me.Label1.TabIndex 2
        Me
.Label1.Text "="
        '
        '
TextBox1
        
'
        Me.TextBox1.Location = New Point(12, 30)
        Me.TextBox1.Name = "TextBox1"
        Me.TextBox1.Size = New Size(65, 20)
        Me.TextBox1.TabIndex = 3
        '
        'TextBox2
        '
        
Me.TextBox2.Location = New Point(13730)
        
Me.TextBox2.Name "TextBox2"
        
Me.TextBox2.Size = New Size(6520)
        
Me.TextBox2.TabIndex 4
        
'
        '
TextBox3
        
'
        Me.TextBox3.Location = New Point(229, 30)
        Me.TextBox3.Name = "TextBox3"
        Me.TextBox3.Size = New Size(100, 20)
        Me.TextBox3.TabIndex = 5
        '
        'ComboBox1
        '
        
Me.ComboBox1.DropDownStyle ComboBoxStyle.DropDownList
        Me
.ComboBox1.FormattingEnabled True
        Me
.ComboBox1.Items.AddRange(New Object() {"+""-""*""/"})
        
Me.ComboBox1.Location = New Point(8330)
        
Me.ComboBox1.Name "ComboBox1"
        
Me.ComboBox1.Size = New Size(4821)
        
Me.ComboBox1.TabIndex 6
        
'
        '
Form
        
'
        form.Controls.Add(Me.ComboBox1)
        form.Controls.Add(Me.TextBox3)
        form.Controls.Add(Me.TextBox2)
        form.Controls.Add(Me.TextBox1)
        form.Controls.Add(Me.Label1)
        form.Controls.Add(Me.Button1)
        '
        'Event Handles
        '
        
AddHandler Button1.ClickAddressOf Button1_Click
    End Sub

    
Public Sub OnCreateMenuStrip(menuStrip As Object) Implements AddIn.OnCreateMenuStrip
        
'
        '
Don't do any thing
        '
    
End Sub

    
Public Sub OnCreateToolStrip(toolStrip As Object) Implements AddIn.OnCreateToolStrip
        
'
        '
Don't do any thing
        '
    
End Sub

    
Private Sub Button1_Click(sender As ObjectAs EventArgs)
        
Select Case ComboBox1.SelectedItem
            
Case "+"
                
TextBox3.Text Val(TextBox1.Text) + Val(TextBox2.Text)
            Case 
"-"
                
TextBox3.Text Val(TextBox1.Text) - Val(TextBox2.Text)
            Case 
"*"
                
TextBox3.Text Val(TextBox1.Text) * Val(TextBox2.Text)
            Case 
"/"
                
TextBox3.Text Val(TextBox1.Text) / Val(TextBox2.Text)
        
End Select
    End Sub

    
Private Button1 As Button
    
Private Label1 As Label
    
Private TextBox1 As TextBox
    
Private TextBox2 As TextBox
    
Private TextBox3 As TextBox
    
Private ComboBox1 As ComboBox

End 
Class 

C#:
PHP كود :
using AddInManager;
using System.Windows.Forms;
using System.Drawing;

public class 
Main AddIn
{

    public 
Main()
    {
        
OnCreateAddIn();
    }

    public 
void OnCreateAddIn()
    {
        
Button1 = new Button();
        
Label1 = new Label();
        
ComboBox1 = new ComboBox();
        
TextBox1 = new TextBox();
        
TextBox2 = new TextBox();
        
TextBox3 = new TextBox();
    }

    public 
void OnCreateMainForm(object form)
    {
        
//
        //Button1
        //
        
this.Button1.Location = new Point(25456);
        
this.Button1.Name "Button1";
        
this.Button1.Size = new Size(7523);
        
this.Button1.TabIndex 0;
        
this.Button1.Text "Calculate";
        
this.Button1.UseVisualStyleBackColor true;
        
//
        //Label1
        //
        
this.Label1.AutoSize true;
        
this.Label1.Location = new Point(20833);
        
this.Label1.Name "Label1";
        
this.Label1.Size = new Size(1513);
        
this.Label1.TabIndex 2;
        
this.Label1.Text "=";
        
//
        //TextBox1
        //
        
this.TextBox1.Location = new Point(1230);
        
this.TextBox1.Name "TextBox1";
        
this.TextBox1.Size = new Size(6520);
        
this.TextBox1.TabIndex 3;
        
//
        //TextBox2
        //
        
this.TextBox2.Location = new Point(13730);
        
this.TextBox2.Name "TextBox2";
        
this.TextBox2.Size = new Size(6520);
        
this.TextBox2.TabIndex 4;
        
//
        //TextBox3
        //
        
this.TextBox3.Location = new Point(22930);
        
this.TextBox3.Name "TextBox3";
        
this.TextBox3.Size = new Size(10020);
        
this.TextBox3.TabIndex 5;
        
//
        //ComboBox1
        //
        
this.ComboBox1.DropDownStyle ComboBoxStyle.DropDownList;
        
this.ComboBox1.FormattingEnabled true;
        
this.ComboBox1.Items.AddRange(new object[] {
            
"+",
            
"-",
            
"*",
            
"/"
        
});
        
this.ComboBox1.Location = new Point(8330);
        
this.ComboBox1.Name "ComboBox1";
        
this.ComboBox1.Size = new Size(4821);
        
this.ComboBox1.TabIndex 6;
        
//
        //Form
        //
        
form.Controls.Add(this.ComboBox1);
        
form.Controls.Add(this.TextBox3);
        
form.Controls.Add(this.TextBox2);
        
form.Controls.Add(this.TextBox1);
        
form.Controls.Add(this.Label1);
        
form.Controls.Add(this.Button1);
        
//
        //Event Handles
        //
        
Button1.Click += Button1_Click;
    }

    public 
void OnCreateMenuStrip(object menuStrip)
    {
        
//
        //Don't do any thing
        //
    
}

    public 
void OnCreateToolStrip(object toolStrip)
    {
        
//
        //Don't do any thing
        //
    
}

    private 
void Button1_Click(object senderEventArgs e)
    {
        switch (
ComboBox1.SelectedItem) {
            case 
"+":
                
TextBox3.Text Conversion.Val(TextBox1.Text) + Conversion.Val(TextBox2.Text);
                break;
            case 
"-":
                
TextBox3.Text Conversion.Val(TextBox1.Text) - Conversion.Val(TextBox2.Text);
                break;
            case 
"*":
                
TextBox3.Text Conversion.Val(TextBox1.Text) * Conversion.Val(TextBox2.Text);
                break;
            case 
"/":
                
TextBox3.Text Conversion.Val(TextBox1.Text) / Conversion.Val(TextBox2.Text);
                break;
        }
    }

    private 
Button Button1;
    private 
Label Label1;
    private 
TextBox TextBox1;
    private 
TextBox TextBox2;
    private 
TextBox TextBox3;

    private 
ComboBox ComboBox1;


والأن سوف نجرب البرنامج


ملاحظات :
1-يجب ان يكون الكلاس الرئيسى فى ال AddIn اسمه Main
يمكنك تغيرة ولكن يجب تغير اسمه فى هذا السطر
PHP كود :
Dim t As Type AddIn.GetType(AddIn.GetName.Name ".الأسم"

2-يمكنك تعديل الكلاس AddIn حتى يتوافق مع برنامجك اكثر

3- اذا كنت تريد ان يصنع الموطورين AddIns لبرنامجك فعلك اعطئهم ملف AddInManager حتى يستطيعوا عمل Implements من ال AddIn

4- لم اقم بتوضح هذا السطر

PHP كود :
LoadAddIn(Application.StartupPath "/CalculatorAddIn.dll", {MeNothingNothing}) 

بالنسبة لل args ان تكون كالتالى

{MainForm, MenuStrip, ToolStrip}

يمكنك تعديل الكود كما تشاء ليناسبك مثل اضافة كلاس اسمه LoadArgs
وتضع فيه ال args التى تريد

واى استفسار انا موجود دائما لخدمتكم

المثال
الرد }}}
تم الشكر بواسطة:
#2
يعطيك الف عافية
(( يَا أَيَّتُهَا النَّفْسُ الْمُطْمَئِنَّةُ ارْجِعِي إِلَى رَبِّكِ رَاضِيَةً مَرْضِيَّةً فَادْخُلِي فِي عِبَادِي وَادْخُلِي جَنَّتِي ))

الرد }}}
تم الشكر بواسطة:
#3
بارك الله فيك
رائع جدا

انا كنت بسوي مقال حول هذا الشي بس اكون فاضي لأن احد الاخوان طلب ذلك
بس انت سويته وريحتني جزاك الله خير

عندي بس ملاحظة بسيطة جدا تخلي كود addinManager اكثر احترافية
فاستعمال overrideable ليس مثاليا جدا

فاستعمال Interface هي الافضل لهذه الامور

بدل
PHP كود :
public class AddIn
{

    public 
AddIn()
    {
        
OnCreateAddIn();
    }

    protected 
virtual void OnCreateAddIn()
    {
        
//اذا كنت تريد كتابة اى كود يستدعى فى ال Sub New
    
}

    protected 
virtual void OnCreateMenuStrip(object menuStrip)
    {
        
//اذا كان برنامجك يحتوى على
        //MenuStrip
        //وتريد اضافة عنصر له
    
}

    protected 
virtual void OnCreateToolStrip(object toolStrip)
    {
        
//اذا كان برنامجك يحتوى على
        //ToolStrip
        //وتريد اضافة عنصر له
    
}

    protected 
virtual void OnCreateMainForm(object form)
    {
        
//الفورم الرئيسى فى برنامجك
    
}


ضع
PHP كود :
public class AddIn
   
{

       protected interface 
IAddInManger
       
{
           
void OnCreateAddIn();

           
void OnCreateMenuStrip(object menuStrip);

           
void OnCreateToolStrip(object toolStrip);

           
void OnCreateMainForm(object form);
       }

    } 

ثم اشتق الinterface في الاضافة واعمل implement



--

كما قلت هذا لايعني ان طريقتك سيئة
هذا فقط اذا كنت تريد زيادة احترافية كودك وتسهيل برمجة الاضافة للمبرمجين الاخرين فأستعمال interface مخصص اكثر لمثل هذه الحالات


تحياتي
الرد }}}
تم الشكر بواسطة:
#4
انا اعرف ال Interface جيدا وبالفعل اضفت Interface ولكنى لااعرف لماذا حذفته واستخدمت هذه الطريقه
كانت افكارى مشوشة بعض الشئ
الرد }}}
تم الشكر بواسطة:
#5
السلام عليكم

جزاك الله خيرا أخي العزيز وجعله في ميزان حسناتك
الرد }}}
تم الشكر بواسطة:
#6
شكراً على الشرح الرائع Smile
سبحان الله وبحمده سبحان الله العظيم

الرد }}}
تم الشكر بواسطة:
#7
نعم هي هذه الفكرة

بارك الله فيك

طبعا كما قال الأخ الشاكي لله، إستخدام Interface هو الأمثل ، ولكن إعداد هذا المثال مربك

طبعا مايكروسوفت وفروا طريقة أسهل منذ 2010
الرد }}}
تم الشكر بواسطة:
#8
الشاكي لله كتب :عندي بس ملاحظة بسيطة جدا تخلي كود addinManager اكثر احترافية
فاستعمال overrideable ليس مثاليا جدا

فاستعمال Interface هي الافضل لهذه الامور

بدل
PHP كود :
public class AddIn
{

    public 
AddIn()
    {
        
OnCreateAddIn();
    }

    protected 
virtual void OnCreateAddIn()
    {
        
//اذا كنت تريد كتابة اى كود يستدعى فى ال Sub New
    
}

    protected 
virtual void OnCreateMenuStrip(object menuStrip)
    {
        
//اذا كان برنامجك يحتوى على
        //MenuStrip
        //وتريد اضافة عنصر له
    
}

    protected 
virtual void OnCreateToolStrip(object toolStrip)
    {
        
//اذا كان برنامجك يحتوى على
        //ToolStrip
        //وتريد اضافة عنصر له
    
}

    protected 
virtual void OnCreateMainForm(object form)
    {
        
//الفورم الرئيسى فى برنامجك
    
}


ضع
PHP كود :
public class AddIn
   
{

       protected interface 
IAddInManger
       
{
           
void OnCreateAddIn();

           
void OnCreateMenuStrip(object menuStrip);

           
void OnCreateToolStrip(object toolStrip);

           
void OnCreateMainForm(object form);
       }

    } 

ثم اشتق الinterface في الاضافة واعمل implement



--

كما قلت هذا لايعني ان طريقتك سيئة
هذا فقط اذا كنت تريد زيادة احترافية كودك وتسهيل برمجة الاضافة للمبرمجين الاخرين فأستعمال interface مخصص اكثر لمثل هذه الحالات


تحياتي

إقتباس :طبعا كما قال الأخ الشاكي لله، إستخدام Interface هو الأمثل ، ولكن إعداد هذا المثال مربك

إقتباس :انا اعرف ال Interface جيدا وبالفعل اضفت Interface ولكنى لااعرف لماذا حذفته واستخدمت هذه الطريقه
كانت افكارى مشوشة بعض الشئ

تم تعديل الموضوع
الرد }}}
تم الشكر بواسطة:
#9
جزاك الله خيرا على هذا الشرح الوافى الجميل

ولى سؤال للاخ الفاضل ابو يعقوب

ماذا تقصد بــ


إقتباس : طبعا مايكروسوفت وفروا طريقة أسهل منذ 2010
الرد }}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم