這是本人畢業設計的項目,一直想將其整理成文,可一不小心4年就過去了(這個時間又可以讀個大學了)。現在給自己定一個目標,一個月時間裡將項目的所有關鍵點都整理出來。不然真怕一眨眼又一個4年過去了,而代碼依然躺在硬盤裡。
項目取名MathAssist,使用vs2008。分成四個子項目:
其主程序可以從插件中掃描可用的命令,也可以顯示插件中可用的窗體。如下是主程序界面,其加載了兩個插件:“superCalculator”和“命令證明”。它們分別提供命令cal prove。

點擊菜單項"插件"的子菜單後可以分別打開兩個插件中實現的窗口。如下圖


分別實現了大數計算和邏輯命題的證明。
在這篇前言中就先只介紹插件機制的實現吧,大數計算和邏輯命題的證明就留給後面的系列。
在MathAssistLibrary項目中只定義了兩個接口: ICommand, IForm,分別用於提供命令行功能和窗口功能。

ICommand接口
IForm接口
在插件項目中只要實現ICommand和IForm兩個接口即可,以SuperCalculator為例:
public partial class frmSuperCalculator : Form, IForm
{
string IForm.Text {
get { return "計算器"; }
}
frmSuperCalculator frm;
Form IForm.GetForm {
get {
if (frm == null || frm.IsDisposed) {
frm = new frmSuperCalculator();
}
return frm;
}
}
...
}
public class Calculator : MathAssistLibrary.ICommand
{
string MathAssistLibrary.ICommand.Describe {
get { return "cal命令可以進行相關的數學運算。比如cal 1+max(2,3)*2"; }
}
string MathAssistLibrary.ICommand.Name {
get { return "cal"; }
}
string MathAssistLibrary.ICommand.Excute(string cmd) {
try {
Expression exp = new Expression();
exp.Format = cmd;
return exp.Calculator().ToString();
} catch (ExpressionException e) {
return string.Format("表達式出錯。出錯類型:{0},出錯位置{1}", e.Message, e.Index);
}
}
}
FindDllFile()函數找到與程序同路徑下的所有dll文件,代碼如下:

LoadOne()從一個文件中找一個特定的類型,並返回其對象,代碼如下:
private List<object> LoadOne(string filename, Type type) {
List<object> result = new List<object>();
try {
Assembly ass = Assembly.LoadFrom(filename);
Module[] mods = ass.GetModules();
foreach (Module mod in mods) {
Type[] typs = mod.GetTypes();
foreach (Type typ in typs) {
if (type.IsAssignableFrom(typ)) {
result.Add(ass.CreateInstance(typ.FullName));
}
}
}
} catch (BadImageFormatException) {
}
return result;
} // end func
先用Assembly.LoadFrom()加載程序集,然後獲取所有模塊,最後在所有模塊中用type.IsAssignableFrom()找與傳入參數type相匹配的類型,如果匹配那麼就創建一個對象並返回。
在主程序中分別用如下兩行代碼調用LoadOne()
List<object> cmd = LoadOne(filename, typeof(ICommand)); List<object> frm = LoadOne(filename, typeof(IForm));
這樣用cmd.Excute()就可以執行插件中實現的代碼,用frm.Show()就可以顯示插件中所實現的窗體。
現提供MathAssist.exe的下載路徑。在後面的文章中會給出整個程序的源碼,敬請期待~~
參數文獻: http://www.cnblogs.com/conexpress/archive/2009/03/04/MyCalculator_01.html