VS2005集成了强大的安装程序制作工具,相信大家在使用中也确实感到方便了不少。但是,如果发布一个产品,就不能直接使用VS2005的安装程序了,因为,我们需要先将所有的程代码先进行混淆。并且,由于本人一直从事SBO的ADDON开发,ADDON的安装程序必须由自己创建,并最终将所有的文件嵌入进一个文件中才能在SBO中正确安装,因此,创建一个自己的安装程序势在必行。
目录
首先,在做向导时,需要创建一个WizardController类
创建一个自己的安装程序,需要如下思路
一、创建一个支持向导的控件。
二、支持读取自己的嵌入资源,并COPY至目录文件夹。
三、支持创建快捷方式、读写注册表信息、创建数据库等安装程序都支持的操作。
以上的操作,我想放在一个基类库中完成。不妨命名为B1Plus.InstallWizardBase。
下面,我们开始做一个向导
首先,在做向导时,需要创建一个WizardController类
说明一下每一个字段、属性和方法
属性:
CurIndex:当前窗体所处的索引号。
FormsCount:所有步骤窗体的总和。
IsFirstForm:是否是第一个窗体。
IsLastForm:是否是最后一个窗体。
IWBParameters:Install Wizard Base Parameters,安装向导支持的参数。
ProgramName:所要安装的程序名。
方法:
AddForms():向Controller控件添加窗体实例。
BeginWizard():启动向导。
Dispose():清理系统资源。
FinishWizard():完成向导。
GoNext():执行下一步。
GoPrev():执行上一步。
代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace B1Plus.InstallWizardBase
{
public class WizardController
{
private ArrayList _WizardForms = new ArrayList();
private int _curIndex = 0;
private object _IWBParameters = null;
public object IWBParameters
{
get { return _IWBParameters; }
set { _IWBParameters = value; }
}
public int CurIndex
{
get { return this._curIndex; }
}
public int FormsCount
{
get { return this._WizardForms.Count; }
}
#region 构造函数
/// <summary>
///构造函数
/// </summary>
public WizardController()
{
}
#endregion
public void AddForms(FormBase formBase)
{
_WizardForms.Add(formBase);
foreach (FormBase frm in _WizardForms)
{
frm.controller = this;
//frm.DisableButtons();
if (this._ProgramName != null)
frm.Text = "欢迎使用 " + this._ProgramName + " 安装向导";
else
{
frm.Text = "B1Plus InstallWizard.";
}
}
}
string _ProgramName = null;
public string ProgramName
{
get { return this._ProgramName; }
set { this._ProgramName = value; }
}
public bool IsFirstForm //属性
{
get { return _curIndex == 0; }
}
public bool IsLastForm //属性
{
get { return _curIndex == this._WizardForms.Count - 1; }
}
public void GoNext()
{
if (_curIndex + 1 < _WizardForms.Count)
{
//((FormBase)_WizardForms[_curIndex]).Visible = false;
((FormBase)_WizardForms[_curIndex]).Hide();
_curIndex++;
}
else
{
return;
}
((FormBase)_WizardForms[_curIndex]).DisableButtons();
((FormBase)_WizardForms[_curIndex]).Show();
}
public void GoPrev()
{
if (_curIndex - 1 >= 0)
{
((FormBase)_WizardForms[_curIndex]).Hide();
_curIndex--;
}
else
{
return;
}
((FormBase)_WizardForms[_curIndex]).DisableButtons();
((FormBase)_WizardForms[_curIndex]).Show();
}
public void BeginWizard()
{
((FormBase)_WizardForms[_curIndex]).DisableButtons();
((FormBase)_WizardForms[0]).Show();
}
public void FinishWizard()
{
_curIndex = 0;
Dispose();
}
private void Dispose()
{
foreach (FormBase frm in _WizardForms)
{
frm.Close();
}
Application.Exit();
}
}
}
接下来,创建一个FormBase
类图
代码(Form.Disgner.cs中的代码略去)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace B1Plus.InstallWizardBase
{
public partial class FormBase : Form
{
public WizardController controller = null;
public FormBase()
{
InitializeComponent();
}
private void btnHelp_Click(object sender, EventArgs e)
{
this.ShowHelp();
}
protected virtual void ShowHelp()
{
MessageBox.Show("此步骤未包含任何帮助信息!\n请联系郭富[42319036]");
}
private void btnPre_Click(object sender, EventArgs e)
{
this.GoPrev();
}
private void btnNext_Click(object sender, EventArgs e)
{
this.GoNext();
}
private void btnStart_Click(object sender, EventArgs e)
{
StartInstall();
}
private void btnFinish_Click(object sender, EventArgs e)
{
Cancel();
}
internal void DisableButtons()
{
if (this.controller == null)
return;
if (this.controller.IsFirstForm)
this.btnPre.Visible = false;
else
this.btnPre.Visible = true;
if (this.controller.IsLastForm)
{
this.btnNext.Visible = false;
this.btnStart.Visible = true;
}
else
{
this.btnNext.Visible = true;
this.btnStart.Visible = false;
}
this.lblStep.Text = (this.controller.CurIndex + 1).ToString() +
"/" + this.controller.FormsCount.ToString();
}
protected virtual void GoPrev()
{
this.controller.GoPrev();
}
protected virtual void GoNext()
{
if (this.controller.IsLastForm)
controller.FinishWizard();
else
this.controller.GoNext();
}
protected virtual void Cancel()
{
this.controller = null;
Application.Exit();
}
protected virtual void StartInstall()
{
MessageBox.Show("请重写此方法以执行安装!");
}
protected virtual void SetBannerInfo(string inf)
{
if (inf != null)
{
if (inf != "")
{
this.lblBanner.Text = inf;
return;
}
}
this.lblBanner.Text = "完成此向导共需" +
this.controller.FormsCount.ToString() +
" 步。您现在处于第" +
(this.controller.CurIndex+1).ToString() +
" 步。";
}
private void FormBase_FormClosing(object sender, FormClosingEventArgs e)
{
}
}
}
如何使用InstallWizardBase
创建一个Windows项目,引用刚刚创建的InstallWizardBase。
然后,创建3个Form,分别为Form1,Form2,Form3。
每个Form必须继承自B1Plus.InstallWizardBase.FormBase.
如果需要确切显示Banner信息,请在Form的构造函数里调用 SetBannerInfo("第一步")方法。
最后,修改Program.cs中的代码为:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace B1Plus.InstallWizard
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
B1Plus.InstallWizardBase.WizardController wc = new B1Plus.InstallWizardBase.WizardController();
wc.ProgramName = "B1Plus Reporter";
wc.AddForms(new Form1());
wc.AddForms(new Form2());
wc.AddForms(new Form3());
wc.BeginWizard();
Application.Run();
}
}
}
完成!