日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺析C#插件式程序開發(fā)經(jīng)驗

在網(wǎng)上找了下插件式編程的資料,這里自己先借鑒下別人的,同時發(fā)現(xiàn)有自己的看法,不過由于本人水平有限,不一定有參考價值,寫出來一方面是為了總結(jié)自己,以求提高,另一方面也希望各為朋友看到我的不足,給我提出寶貴意見。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:空間域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、重慶網(wǎng)站維護、網(wǎng)站推廣。

什么是插件式編程

提起插件式,我們首先想到的是firefox,用過firefox的人都知道它是一個插件式程序。當一個功能需要,完全可以從網(wǎng)上下載一個插件后,重啟后,就能使用。這個功能給我們帶來許多的方便之處,這就是插件式程序的好處。

插件的本質(zhì)在于不修改程序主體(平臺)的情況下對軟件功能進行拓展與加強,當插件的接口公開后,任何公司或個人都可以制作自己的插件來解決一些操作上的不便或增加新功能,也就是真正意義上實現(xiàn)“即插即用”軟件開發(fā)。

平臺+插件軟件結(jié)構(gòu)是將一個待開發(fā)的目標軟件分為兩部分,一部分為軟件的主體或框架,可定義為平臺,這是預先編譯后的程序。另一部分為功能或補充模塊,可定義為插件。這個就是后來要進行安裝的插件程序。

假設(shè)你的程序已經(jīng)部署在用戶的計算機上,并且能夠正常運行了。但是有一天,用戶打來電話——他們需要增加新的功能。確定了用戶的需求后,你竟然發(fā)現(xiàn)原有的軟件架構(gòu)已經(jīng)無法勝任新增任務(wù)的需求——你需要重新設(shè)計這個應用了!但問題是,就算你又用了一個開發(fā)周期完成了用戶需要的應用,切不能保證用戶的需求不會再次變更。也就是說,需求蔓延的可能性依然存在。因此,這種情況下插件架構(gòu)更能顯示出它的優(yōu)越性。

可以這么說,用它可以帶來方便的地方,而且開發(fā)它,也很簡單。而且這樣的主程序根本就不需要改動。需要插件時,拿來就能用,插件更新時,也只需更新這個插件即可。

從程序開發(fā)這角度,一般是先開發(fā)主程序,決定哪些功能由主程序來完成,然后再建立接口,申明接口的內(nèi)容,這些內(nèi)容決定著插件功能的擴展,及方向的。這些都是有主程序開發(fā)者預先準備好的。插件開發(fā)者,從主程序開發(fā)者那里得到接口的內(nèi)容,并書寫繼承這些接口的類,來完成具體的功能。

下面來寫個例子,這個例子沒實際意義,純屬學習思想。例子是網(wǎng)上的經(jīng)過自己改造的,發(fā)現(xiàn)別人某些地方不合理。

首先,新建一個類庫,里面定義接口,這里定義兩個方法,一個有返回值的,一個無返回值的。

 
 
 
 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace IMsg{   
  5.  ///    
  6.  /// 這是插件必須實現(xiàn)的接口,也是主程序與插件通信的***接口    
  7. /// 換句話說,主程序只認識插件里的這些方法   
  8.  ///   public  interface IMsgPlug   
  9.  {       
  10.  void OnShowDlg();    
  11.     string OnShowInfo(); 
  12.    }}

將上面的類庫生成IMsg.dll,新建一個類庫MYPlugin1,添加剛出的引用,分別新建兩個類來實現(xiàn)IMsg中定義的接口。

 
 
 
 
  1. using System;
  2. using System.Collections.Generic;using System.Text;using IMsg;
  3. namespace MYPlugin1{    
  4. public class myConsole : IMsgPlug   
  5.  {       
  6.  #region IMsgPlug 成員       
  7.  public  void OnShowDlg()     
  8.    {         
  9.    Console.WriteLine("控制臺調(diào)用插件的OnShowDlg方法");     
  10.    }    
  11.     public  string OnShowInfo()    
  12.     {            return "myConsole";    
  13.     }        #endregion  
  14.   }}
  15. using System;
  16. using System.Collections.Generic;
  17. using System.Text;
  18. using System.Windows.Forms;
  19. using IMsg;namespace MYPlugin1{ 
  20. public  class MYDlg:Form,IMsgPlug   
  21.  {        #region IMsgPlug 成員 
  22.        public  void OnShowDlg()   
  23.      {          
  24.  this.Text = "插件子窗體";         
  25.   this.ShowDialog();
  26. //調(diào)用Form的ShowDialog,顯示窗體        }     
  27.    public  string OnShowInfo()  
  28.       {            return "MyDlg";     
  29.    }        #endregion  
  30.   }}

將上面的都生成dll,生成目錄可以設(shè)置為新建exe工程的bin目錄plugins文件夾下。Plugins文件夾是新建的,專門存放插件的。 新建一個 WinForm項目,來使用剛才的插件.

  
   using
    System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Collections;
using System.IO;
using System.Reflection;
namespace MsgBoxMain
{
public partial class FormMain : Form
{

///
/// 存放插件的集合
///

private ArrayList plugins = new ArrayList();
public FormMain()
{
InitializeComponent();
}

///
/// 載入所有插件
///

private void LoadAllPlugs()
{
// 獲取插件目錄(plugins)下所有文件
string [] files = Directory.GetFiles(Application.StartupPath + @" \plugsins " );
foreach ( string file in files)
{
if (file.ToUpper().EndsWith( " .DLL " ))
{
try
{
// 載入dll
Assembly ab = Assembly.LoadFrom(file);
Type[] types = ab.GetTypes();
foreach (Type t in types)
{
// 如果某些類實現(xiàn)了預定義的IMsg.IMsgPlug接口,則認為該類適配與主程序(是主程序的插件)
if (t.GetInterface( " IMsgPlug " ) != null )
{
plugins.Add(ab.CreateInstance(t.FullName));
listBox1.Items.Add(t.FullName);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

}



private void btnLoadPlug_Click( object sender, EventArgs e)
{
LoadAllPlugs();
}

// 調(diào)用插件的方法
private void btnExecute_Click( object sender, EventArgs e)
{
if ( this .listBox1.SelectedIndex == - 1 ) return ;
object selObj = this .plugins[ this .listBox1.SelectedIndex];
Type t = selObj.GetType();
MethodInfo OnShowDlg = t.GetMethod( " OnShowDlg " );
MethodInfo OnShowInfo = t.GetMethod( " OnShowInfo " );

OnShowDlg.Invoke(selObj, null );
object returnValue = OnShowInfo.Invoke(selObj, null );
this .lblMsg.Text = returnValue.ToString();

}
}
}

這里與網(wǎng)上那位原創(chuàng)的仁兄的看法不同,可供大家討論。

原文有這樣的一段:

if (itemStr == "myConsole")
{ //調(diào)用存儲在動態(tài)數(shù)組plugins里面的插件對象的OnShowInfo方法
string msgInfo = ((IMsgPlug)plugins[ListItems.SelectedIndex]).OnShowInfo();
MessageBox.Show(msgInfo, "MYPlugin1", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else if (itemStr == "MYDlg")//調(diào)用存儲在動態(tài)數(shù)組plugins里面的插件對象的OnShowDlg方法
{
((IMsgPlug)plugins[ListItems.SelectedIndex]).OnShowDlg();
}

我認為既然是插件,就應該是動態(tài)加載的,客戶端肯定不能判斷 itemStr,因為實現(xiàn)接口的類是不可預料的,因此主程序不應該添加對IMsg的引用,也不應該在客戶端實例化插件對象,因為插件開發(fā)的初衷是為了以后更新的時候不更改主程序,只提供對應的dll 下載,就可以直接使用了,以前的接口都定義好了,新的實現(xiàn)類也就是不可預料的,因此不能在主程序?qū)嵗瘜崿F(xiàn)接口的類,這樣違背了插件的初衷。


新聞標題:淺析C#插件式程序開發(fā)經(jīng)驗
轉(zhuǎn)載注明:http://www.5511xx.com/article/cohjhid.html