這裡函數參數為要調用 的腳本方法的名稱,不區分大小寫,調用腳本使用的參數列表,還有控制是否拋出異常的參 數。在函數裡面,程序遍歷myScriptMethods列表中所有以前找到的腳本方法的信息,查找指 定名稱的腳本方法,若找到則使用腳本方法的Invoke函數執行腳本方法,如此陳旭就能調用 腳本了。
為了豐富腳本引擎的編程接口,筆者還定義了HasMethod函數來判斷是否存 在指定名稱的腳本方法,定義了ExecuteSub函數來安全的不拋出異常的調用腳本方法。
Window全局對象
在很多腳本中存在一個名為“window”的全局對 象,該對象大多用於和用戶界面互換,並映射到應用系統主窗體。在這裡筆者仿造Html的 Javascript腳本的window全局對象來構造出自己的window全局對象。
參考Javascript 中的window全局對象,對筆者有參考意義的類型成員主要分為映射到屏幕大小或者主窗體的 位置大小的屬性,還有延時調用和定時調用的方法,還有顯示消息框或輸入框的方法。
筆者建立一個XVBAWindowObject類型作為Window全局對象的類型。
成員屬性
筆者首先定義一個UserInteractive屬性,該屬性指定應用系統是否能和用戶桌面交 互。定義該屬性的代碼如下
protected bool bolUserInteractive = true;
/// <summary>
/// 是否允許和用戶交互,也就是是否顯示用戶 界面
/// </summary>
/// <remarks>當應用程序為ASP.Net或者 Windows Service程序時不能有圖形化用戶界面,因此需要設置該屬性為 false.</remarks>
public bool UserInteractive
{
get { return bolUserInteractive; }
set { bolUserInteractive = value; }
}
一些應用系統,包括ASP.NET和Windows Service,它是不能和用戶交互的 ,不能有圖形化用戶界面,不能調用MessageBox函數,不能使用.NET類庫中 System.Widnows.Forms名稱空間下的大部分功能,若強行調用則會出現程序錯誤。這個腳本 引擎設計目標是可以運行在任何程序類型中的,包括WinForm,命令行模式,ASP.Net和 Windows Service。因此在這裡筆者定義了UserInteractive屬性用於關閉window全局對象的 某些和用戶互換相關的功能,比如顯示消息框,延時調用和定時調用等等,主動關閉這些功 能對應用系統的影響是不大的。
筆者還定義了其他的一些屬性,其定義的代碼如下
protected string strSystemName = "應用程序";
/// <summary>
/// 系統名稱
/// </summary>
public string SystemName
{
get
{
return strSystemName;
}
set
{
strSystemName = value;
}
}
protected XVBAEngine myEngine = null;
/// <summary>
/// 腳本引擎對象
/// </summary>
public XVBAEngine Engine
{
get { return myEngine; }
}
protected System.Windows.Forms.IWin32Window myParentWindow = null;
/// <summary>
/// 父窗體對象
/// </summary>
public System.Windows.Forms.IWin32Window ParentWindow
{
get { return myParentWindow; }
set { myParentWindow = value; }
}
/// <summary>
/// 屏幕寬度
/// </summary>
public int ScreenWidth
{
get
{
if (bolUserInteractive)
{
return System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
}
else
{
return 0;
}
}
}
/// <summary>
/// 屏幕高度
/// </summary>
public int ScreenHeight
{
get
{
if (bolUserInteractive)
{
return System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
}
else
{
return 0;
}
}
}
這裡的 ParentWindow屬性表示應用系統的主窗體。