一
假設你設計的程序已經部署到用戶的計算機上
我總結了一下我所接觸到的插件構架
i> 腳本式
使用某種語言把插件的程序邏輯寫成腳本代碼
這種形式的特點在於
ii> 動態函數庫 DLL
插件功能以動態庫函數的形式存在
iii> 聚合式
顧名思義
iv> COM 組件
COM [
C# 是面向對象的程序設計語言
下面
二
好了
我們的程序編輯器會向插件開放正在編輯的文檔對象
根據上面的需求
public interface IApplicationObject {
void Alert( string msg ); // 產生一條信息
void ShowInStatusBar( string msg ); // 將指定的信息顯示在狀態欄
IDocumentObject QueryCurrentDocument(); // 獲取當前使用的文檔對象
IDocumentObject[] QueryDocuments(); // 獲取所有的文檔對象
// 設置事件處理器
void SetDelegate( Delegates whichOne
}
// 目前只需要這一個事件
public enum Delegates {
Delegate_ActiveDocumentChanged
}
然後是 IDocumentObject 接口
///
/// 編輯器對象必須實現這個接口
///
public interface IDocumentObject {
// 這些屬性是 RichTextBox 控件的相應的屬性映射
string SelectionText { get ; set ; }
Color SelectionColor { get ; set ; }
Font SelectionFont { get ; set ; }
int Selection
int SelectionLength { get ; set ; }
string SelectionRTF { get ; set ; }
bool HasChanges { get ; }
void Select( int
void AppendText( string str );
void SaveFile( string fileName );
void SaveFile();
void OpenFile( string fileName );
void CloseFile();
}
這個接口不需要過多解釋
再然後
///
/// 本程序的插件必須實現這個接口
///
public interface IPlugin {
ConnectionResult Connect( IApplicationObject app );
void OnDestory();
void OnLoad();
void Run();
}
///
/// 表示插件與主程序連接的結果
///
public enum ConnectionResult {
Connection_Success
Connection_Failed
}
主程序會首先調用 Connect() 方法
一個插件需要有它的名稱
///
/// 用來指定一個插件的相關信息
///
public class PluginInfoAttribute : System
{
///
/// Deprecated
///
public PluginInfoAttribute() {}
public PluginInfoAttribute(
string name
string author
// 細節已略去
}
public string Name { get { return _Name; } }
public string Version { get { return _Version; } }
public string Author { get { return _Author; } }
public string Webpage { get { return _Webpage; } }
public bool LoadWhen
///
/// 用來存儲一些有用的信息
///
public object Tag {
get { return _Tag; }
set { _Tag = value ; }
}
///
/// 用來存儲序號
///
public int Index {
get { return _Index; }
set { _Index = value ; }
}
private string _Name =
private string _Version =
private string _Author =
private string _Webpage =
private object _Tag = null ;
private int _Index =
// 暫時不會用
private bool _LoadWhen
}
用這個類修飾你的插件
///
/// My Pluging
///
[
PluginInfo(
]
public class MyPlugin
public MyPlugin
#region IPlugin 成員
// 細節已略去
#endregion
private IApplicationObject _App;
private IDocumentObject _CurDoc;
}
現在就得用到 System
private bool IsValidPlugin( Type t ) {
bool ret = false ;
Type[] interfaces = t
fo
if ( theInterface
ret = true ;
break ;
}
}
return ret;
}
若條件都滿足
plugins
現在
From:http://tw.wingwit.com/Article/program/ASP/201311/21857.html