3.添加安装程序类文件WebSetupTest.cs 里面重载Install和Uninstall方法.
public override void Install(IDictionary stateSaver)
{
bool TrustedConnection=false;
base.Install (stateSaver);
try
{
if(this.Context!=null)
{
StringDictionary parameters = Context.Parameters ;
string[] keys =new string[parameters.Count];
parameters.Keys.CopyTo(keys,0);
"把数据库\服务器名\数据库用户名\数据库密码\安装路径写进 stateSaver"#region "把数据库\服务器名\数据库用户名\数据库密码\安装路径写进 stateSaver"
//MessageBox.Show(this.Context.Parameters["target"].ToString());
stateSaver.Add("database",this.Context.Parameters["database"].ToString());
stateSaver.Add("server",this.Context.Parameters["server"].ToString());
stateSaver.Add("username",this.Context.Parameters["username"].ToString());
stateSaver.Add("password",this.Context.Parameters["password"].ToString());
stateSaver.Add("target",this.Context.Parameters["target"].ToString());
#endregion
//测试连接#region //测试连接
//can encrypt here
string connectionstring= "Data Source=" + stateSaver["server"].ToString() ;
connectionstring+= ";Initial Catalog=" + stateSaver["database"].ToString() ;
if(stateSaver["username"]!=null && stateSaver["username"].ToString().Length!=0)
{
SqlConnection conn =new SqlConnection( "server=" + stateSaver["server"].ToString()
+ ";database=master;Uid=" + stateSaver["username"].ToString() +";Password=" + stateSaver["password"].ToString());
conn.Open();
conn.Close();
conn.Dispose();
connectionstring+= ";User ID=" + stateSaver["username"].ToString() ;
connectionstring+= ";Password=" + stateSaver["password"].ToString() ;
}
else
{
//信任连接
SqlConnection conn =new SqlConnection( "Data Source=" + stateSaver["server"].ToString()
+ ";Initial Catalog=master;trusted_connection=yes");
conn.Open();
conn.Close();
conn.Dispose();
TrustedConnection=true;
stateSaver.Add("trustedconnection",true);
connectionstring+=";Trusted_connection=yes";
}
#endregion
//把数据库连接字符串写进web.config文件.#region //把数据库连接字符串写进web.config文件.
XmlDocument doc = new XmlDocument();
doc.Load(stateSaver["target"].ToString()+ @"Web.config");
XmlNode connectionNode = doc.SelectSingleNode(@"configuration/appSettings/add[@key='Conn_WebSetupTest']");
if(connectionNode!=null)
{
connectionNode.Attributes["value"].Value = connectionstring;
doc.Save( stateSaver["target"].ToString()+ @"Web.config");
EventLog.WriteEntry("安装数据","Configuration file processed"); //写日志
}
else
{
//This error will ensure installation is uncomplete
throw new InstallException("没有数据库连接串!");
}
#endregion
//执行数据库脚本,安装数据库#region //执行数据库脚本,安装数据库
DataBase dbInstall =null;
if(TrustedConnection)
{
dbInstall= new DataBase(stateSaver["server"].ToString(),stateSaver["database"].ToString(),
stateSaver["target"].ToString());
}
else
{
dbInstall= new DataBase(stateSaver["server"].ToString(),stateSaver["database"].ToString(),
stateSaver["username"].ToString(),stateSaver["password"].ToString(),stateSaver["target"].ToString());
}
dbInstall.CreateDataBase();
dbInstall.InsertDate();
#endregion
//部署桌面快捷方式*******************#region//部署桌面快捷方式*******************
StreamWriter sw2=System.IO.File.CreateText(Context.Parameters["des"].ToString()+"WebSetupTest.url");
stateSaver.Add("DeskQuick",Context.Parameters["des"].ToString()+"WebSetupTest.url"); //保存桌面快诫方式文件绝对地址
//Context.Parameters["des"].ToString()是对应的桌面地址
string webdirs=Context.Parameters["webdir"].ToString();
//Context.Parameters["webdir"].ToString()对应的路径,在安装项目里面作为参数传入
string webdirsNew = webdirs.Substring(0,webdirs.Length-1);
webdirs = webdirsNew.Substring(webdirsNew.LastIndexOf(@"\")+1);
string Urls=@"URL=http://localhost/"+webdirs+@"/index.aspx";
sw2.WriteLine("[InternetShortcut]");
sw2.WriteLine(Urls);
sw2.WriteLine("modified=228928983");
sw2.WriteLine("IconIndex=0");
//sw2.WriteLine("IconFile="+webdirsNew+"\\Resources\\usa_folder_dialup.ico");
sw2.WriteLine("IconFile="+webdirsNew+"\\images\\usa_folder_dialup.ico");
sw2.Flush();
sw2.Close();
#endregion
部署开始菜单 ***************#region 部署开始菜单 ***************
string startMenue=Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);
if(File.Exists(startMenue+"\\WebSetupTest.url"))
{
if(MessageBox.Show("开始菜单已经存在,是否有覆盖它?","安装开始菜单",MessageBoxButtons.YesNo,MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1) == DialogResult.Yes)
{
File.Copy(Context.Parameters["des"].ToString()+"WebSetupTest.url",startMenue+"\\WebSetupTest.url",true);
}
else
{
throw new InstallException("开始菜单已经存在,安装取消");
}
}
else
{
File.Copy(Context.Parameters["des"].ToString()+"WebSetupTest.url",startMenue+"\\WebSetupTest.url",false);
}
stateSaver.Add("StartMenueFile",startMenue+"\\WebSetupTest.url"); //保存开始菜单文件绝对地址
#endregion
}
}
catch(Exception ex1)
{
throw new System.Configuration.Install.InstallException(ex1.ToString());
}
}
public override void Uninstall(IDictionary savedState)
{
try
{
if(savedState!=null)
{
base.Uninstall (savedState);
删除快捷键,删除开始菜单#region 删除快捷键,删除开始菜单
//删除快捷键
if(File.Exists(savedState["DeskQuick"].ToString()))
{
File.Delete(savedState["DeskQuick"].ToString());
}
//删除开始菜单
if(File.Exists(savedState["StartMenueFile"].ToString()))
{
File.Delete(savedState["StartMenueFile"].ToString());
}
#endregion
//删除数据库#region //删除数据库
if(MessageBox.Show("要删除数据库吗?" +savedState["database"].ToString()+".\n ","确认删除数据库",MessageBoxButtons.YesNo,MessageBoxIcon.Question ,MessageBoxDefaultButton.Button2)== DialogResult.No)
{
return;
}
DataBase dbInstall=null;
if(savedState["trustedconnection"]!=null && (bool)savedState["trustedconnection"])
{
dbInstall= new DataBase(savedState["server"].ToString(),savedState["database"].ToString(),
savedState["target"].ToString());
}
else
{
dbInstall= new DataBase(savedState["server"].ToString(),savedState["database"].ToString(),
savedState["username"].ToString(),savedState["password"].ToString(),savedState["target"].ToString());
}
dbInstall.DropDataBase();
#endregion
}
else
{
MessageBox.Show("Saved state was nullsome error.");
throw new ApplicationException("卸载需要的参数不存在!");
}
}
catch(InstallException inst)
{
throw new InstallException(inst.Message);
}
catch(Exception generic)
{
throw new InstallException(generic.Message);
}
}
(四)在同一解决方案里添加'Web安装项目"WebSetup
1.打开"文件系统"视图
(1)"web应用程序文件夹"-->右键"添加"-->"项目输出" 选择"WebSetupTest"里的"主输出"和"内容文件",如下图:
![](UploadFiles/20071210115642734.GIF)
主输出一般是dll文件,内容文件包括aspx文件\web.config\images目录等等.
(2)"web应用程序文件夹"--新建目录"install",然后"install"右键"项目输出" 选择"WebSetupLib"里的"主输出"和"内容文件"
2.打开"用户界面"视图.
(1)."安装"--"启动"-->右键"添加对话完"--"许可协议".
添加完毕后在"许可协议"的"属性窗口"中添加刚才的UserProtocol.rtf文件.
(2).用上面一样的方法添加"文本框(A)",在其属性里设置服务器和数据库信息
![](UploadFiles/20071210115645580.GIF)
下图是上面是两个对话框添加完毕后的"用户界面"视图.
![](UploadFiles/20071210115646621.GIF)
3.打开"自定义操作"视图.
(1)"安装"-->右键"添加自定义操作"选择"install"目录下的"主输出来自WebSegtupLib",命名为Install
它是设置自定义的数据/快捷方式/开菜单等.
![](UploadFiles/20071210115646360.GIF)
(2)在上面的install属性窗口里"CustomActionData"的值为/server=[SERVER_NAME] /target="[TARGETDIR]\" /database=[DATABASE_NAME] /username=[USER_NAME] /password=[PASSWORD] /version=[WINDOWSVERSION] /des="[DesktopFolder]\" /webdir="[TARGETDIR]\"
(3)"卸载"--右键"添加自定义操作"选择"install"目录下的"主输出来自WebSegtupLib".命名为UnInstall
这样卸载的时候将删除数据库/快捷方式/开菜单等.下图是两个子定义操作后的"自定义操作"视图.
![](UploadFiles/20071210115646371.GIF)
4."启动条件"视图使用默认值.
五.编译安装项目
编译后将生成WebSetup.msi安装文件.这样就可以安装了.下面是安装效果图
![](UploadFiles/20071210115647797.GIF)
![](UploadFiles/20071210115647112.GIF)
![](UploadFiles/20071210115648784.GIF)
六.参考资料
自定义 MSI 安装(里面有详细的数据库部署代码实例)
http://www.netscum.dk/china/msdn/library/langtool/vsdotnet/usvs04j7.mspx
本文作者:adandelion 来源:本站原创
CIO之家 www.ciozj.com 微信公众号:imciow