如果你需要一个这样的安装组件:它可以读取XML配置文件(SetupScripts.xml),然后异步地运行定义在它里面的方法或脚本(比如执行一个可执行文件);本文的组件一定最适合你了。
翻译
BabakAnsari. 著Asynchronous Setup Grid
简介
如果你需要一个这样的安装组件:它可以读取XML配置文件(SetupScripts.xml),然后异步地运行定义在它里面的方法或脚本(比如执行一个可执行文件);本文的组件一定最适合你了。
解决方案
SetupGridUC 是一个用户控件,它包括一个DataGridView,以在安装执行的时候显示脚本和进度状况。
一个典型的用法如下:
1.用Load()方法从SetupScripts.xml文件初始化SetupGridUC
2.调用其StartSetup()方法开始安装,或者开始之后调用StopSetup(false)
3.为了完成一些其它的功能,如在开始安装后置灰按钮,或结束安装后enable按钮,你可以使用下面的事件:
3.1安装结束后,组件会调用void stpGrid_ProgressFinished(object sender, EventArgs e)
3.2安装程序开始后,组件会调用void stpGrid_ProgressStarted(object sender, EventArgs e)
实现
StartSetup()方法通过调用SetupGridUC的ExecuteScript()方法开始安装:
private MethodDelegate methodDelegate;
...
asyncResult = methodDelegate.BeginInvoke(null, null);
因为,我们需要在另一个线程中刷新界面,如DataGridView,所以我们使用了Invoke()
private delegate void VoidDelegate();
...
private void SafeInvoke(Control ctrl, VoidDelegate delgt)
{
if (ctrl.InvokeRequired)
{
VoidDelegate d = new VoidDelegate(delgt);
ctrl.Invoke(d, new object[] { });
}
}
private void command_Progress(object sender, ProgressEventArgs e)
{
/// Call Refresh method of asyncSetupGrid using Invoke
SafeInvoke(asyncSetupGrid, Refresh);
}
你可以在SetupScripts.xml文件中,定义各个待执行的方法和脚本:
<tblSetupScripts>
<ID>2</ID>
<Name>S3</Name>
<Title>Execute SQLQuery.sql against Database</Title>
<Script>SQLQuery.sql</Script>
<Kind>SQLScript</Kind>
</tblSetupScripts>
上面的各标签的含义是:
<Name>:
Name必须唯一,以付给一个执行的任务
<Title>:
Title是这段脚本的说明文字
<Script>:
Script标签的意思,需要由Kind规定:
<Kind>Method</Kind>
<Script>
{Assembly file name}, {Namespace. class name}, {Method name}
/// <summary>
/// This method is being called using reflection. It is defined in SetupScripts.xml file. Developer should pass following two delegate parameters to it that are doing some actions on calling SetupGrid object.
/// </summary>
/// <param name="doProgress"> This method sets progress bar status in the subject row of the SetupGrid </param>
/// <param name="doHalt"> This method returns true if user stops the setup process </param>
public void Mehtod(SetupGrid.ScriptCommands.ProgressDelegate doProgress, SetupGrid.ScriptCommands.HaltDelegate doHalt)
{
...
}
</Script>
上面的Kind表明一个函数
<Kind>SQLScript</Kind>
<Script> {Path of SQL script to be executed}
The T-SQL commands are separated using 'Go' command from each other. For example:
...
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
...
</Script>
上面的Kind表明一个SQL 脚本
<Kind>BatchFile</Kind>
<Script> { The path and file name of the Batch file to be executed}
The batch file execution will open a Command Prompt window and waits the command is finished.
</Script>
上面的Kind表明是一批处理文件
附件中的程序
本文中的例子,包括2个程序:
1. Main.exe是调用了SetupGrid组件的可执行程序,为示例程序
2. SetupGrid.dll是一个包含SetupGrid组件的链接库
为了测试SQL 脚本,你需要创建在SQL Server中创建一个数据库,然后在Properties/Settings.settings文件中设置正确的连接字符串。
文件下载:
SetupGrid.zip
http://www.cnblogs.com/lijun4017/archive/2008/04/17/1158151.html
http://www.cnblogs.com/lijun4017/archive/2010/08/10/1796667.html