IMsg定義了一個接口,MYPlugin1實現接口功能,”插件式開發“實現程序運行時再調用非本身引用的dll文件,調用該dll的方法實現功能
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace IMsg { ///<summary> /// 這是插件必須實現的接口,也是主程序與插件通信的唯一接口 /// 換句話說,主程序只認識插件裡的這些方法 ///</summary> public interface IMsgPlug { void OnShowDlg(); string OnShowInfo(); } }
using System; using System.Collections.Generic; using System.Text; using IMsg; namespace MYPlugin1 { public class myConsole : IMsgPlug { #region IMsgPlug 成員 public void OnShowDlg() { Console.WriteLine("控制台調用插件的OnShowDlg方法"); } public string OnShowInfo() { return "myConsole"; } #endregion } }
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using IMsg; namespace MYPlugin1 { public class MYDlg : Form, IMsgPlug { #region IMsgPlug 成員 public void OnShowDlg() { this.Text = "插件子窗體"; this.ShowDialog();//調用Form的ShowDialog,顯示窗體 } public string OnShowInfo() { return "MyDlg"; } #endregion } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Collections; using System.IO; using System.Reflection; namespace 插件式開發 { /// <summary> /// MainWindow.xaml 的交互邏輯 /// </summary> public partial class MainWindow : Window { // 存放插件的集合 private ArrayList plugins =new ArrayList(); public MainWindow() { InitializeComponent(); } ///<summary> /// 載入所有插件 ///</summary> private void LoadAllPlugs() { //獲取插件目錄(plugins)下所有文件 // string[] files = Directory.GetFiles(Application.ResourceAssembly + @"\plugins"); //string str6 = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//獲得到debug的文件夾 //str6 = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;//獲得到exe文件 //str6 = System.Environment.CurrentDirectory;//獲得到debug的文件夾 //str6 = System.IO.Directory.GetCurrentDirectory();//獲得到debug的文件夾 //str6 = System.AppDomain.CurrentDomain.BaseDirectory;//獲得到debug的文件夾 //str6 = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//獲得到debug的文件夾 //str6 = System.Windows.Forms.Application.StartupPath;//獲得到debug的文件夾 //string[] files = Directory.GetFiles(AppDomain.CurrentDomain +"plugins"); string[] files = Directory.GetFiles(@"E:\練習代碼\IMsg\插件式開發\plugins");//得到dll文件的存放路徑 foreach (string file in files) { if (file.ToUpper().EndsWith(".DLL"))//如果文件以dll結尾 { try { //載入dll Assembly ab = Assembly.LoadFrom(file);//一個程序集合 Type[] types = ab.GetTypes();//類型數組 foreach (Type t in types) { //如果某些類實現了預定義的IMsg.IMsgPlug接口,則認為該類適配與主程序(是主程序的插件) if (t.GetInterface("IMsgPlug") != null) { plugins.Add(ab.CreateInstance(t.FullName));//將實例化的dll加入到泛型集合中 lstWays.Items.Add(t.FullName);//顯示在listbox中 } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } //窗體載入事件 private void Window_Loaded(object sender, RoutedEventArgs e) { LoadAllPlugs(); } //調用插件的方法 private void btnGetIn_Click(object sender, RoutedEventArgs e) { if (this.lstWays.SelectedIndex == -1) return; object selObj = this.plugins[this.lstWays.SelectedIndex]; Type t = selObj.GetType(); MethodInfo OnShowDlg = t.GetMethod("OnShowDlg");//得到dll文件的中的方法 MethodInfo OnShowInfo = t.GetMethod("OnShowInfo");//得到dll文件的中的方法 OnShowDlg.Invoke(selObj, null);//方法調用參數 object returnValue = OnShowInfo.Invoke(selObj, null); } } }
提起插件式,我們首先想到的是firefox, 用過firefox的人都知道它是一個插件式程序。當一個功能需要,完全可以從網上下載一個插件後,重啟後,就能使用。這個功能給我們帶來許多的方便之處,這就是插件式程序的好處。
插件的本質在於不修改程序主體(平台)的情況下對軟件功能進行拓展與加強,當插件的接口公開後,任何公司或個人都可以制作自己的插件來解決一些操作上的不便或增加新功能,也就是真正意義上實現“即插即用”軟件開發。
平台+插件軟件結構是將一個待開發的目標軟件分為兩部分,一部分為軟件的主體或框架,可定義為平台,這是預先編譯後的程序。另一部分為功能或補充模塊,可定義為插件。這個就是後來要進行安裝的插件程序。
假設你的程序已經部署在用戶的計算機上,並且能夠正常運行了。但是有一天,用戶打來電話——他們需要增加新的功能。確定了用戶的需求後,你竟然發現原有的軟件架構已經無法勝任新增任務的需求——你需要重新設計這個應用了!但問題是,就算你又用了一個開發周期完成了用戶需要的應用,切不能保證用戶的需求不會再次變更。也就是說,需求蔓延的可能性依然存在。因此,這種情況下插件架構更能顯示出它的優越性。
可以這麼說,用它可以帶來方便的地方,而且開發它,也很簡單。而且這樣的主程序根本就不需要改動。需要插件時,拿來就能用,插件更新時,也只需更新這個插件即可。
從程序開發這角度,一般是先開發主程序,決定哪些功能由主程序來完成,然後再建立接口,申明接口的內容,這些內容決定著插件功能的擴展及方向的。這些都是有主程序開發者預先准備好的。插件開發者,從主程序開發者那裡得到接口的內容,並書寫繼承這些接口的類,來完成具體的功能。
你要的是不是這個課程,大綱如下: 本課程分為五個部分: 1、使用ADO.NET來操作Excel表 2、使用WPF的特效和動畫技術來構建超炫界面 3、使用WPF的控件來做數據綁定 4、使用Repository模式、MVP和MVVM框架構建系統架構 5、使用IOC注入對象 課程大綱 第1講:項目的需求分析 第2講:項目數據庫文件設計 第3講:構建項目的數據文件訪問技術-excel操作技術 第4講:項目的多層架構設計 第5講:構建項目的數據文件訪問層1-IDAL 第6講:構建項目的數據文件訪問層2-反射 第7講:構建項目的數據文件訪問層3-Repository模式 第8講:構建項目的Model層 第9講:項目的界面結構設計技術1-布局畫刷 第10講:項目的界面結構設計技術2-資源使用 第11講:項目的界面結構設計技術3 - 動畫 第12講:項目的登陸實現 第13講:MVP模式實現登陸 第14講:項目對話框實現 第15講:項目主界面實現 第16講:項目主界面實現-使用Viewport2DVisual3D控件 第17講:客戶基本信息管理模塊-添加、查詢 第18講:客戶基本信息管理模塊-菜單、修改、刪除 第19講:MVVM模式實現客戶查詢 第20講:客戶財務信息管理模塊 第21講:客戶保險記錄信息管理模塊 第22講:客戶家庭信息管理模塊 第23講:拜訪客戶記錄模塊 第24講:使用IOC框架Autofac 第25講:項目開發總結
sdk有些特別的庫還是要裝
WPF不用安了
因為Vs2008已經完全安裝了WPF
還有就是目前 Vs2008,對SL和F#的開發不完全,其它都可以