VS2003 安装部署4

来源:互联网 发布:手机获取电话号码软件 编辑:程序博客网 时间:2024/05/16 12:57

3.添加安装程序类文件WebInstaller.cs 里面重载Install和Uninstall方法.
using System;

using System.Data;

using System.Collections;

using System.ComponentModel;

using System.Configuration.Install;

using System.Collections.Specialized;

using System.Data.SqlClient;

using System.Xml;

using System.Diagnostics;

using System.IO;

using System.Web;

using System.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Text;

using System.Windows.Forms;

namespace WebSetupLib

{

     /// <summary>

     /// WebInstaller 的摘要说明。

     /// </summary>

     [RunInstaller(true)]

     public class WebInstaller : System.Configuration.Install.Installer

     {

         /// <summary>

         /// 必需的设计器变量。

         /// </summary>

         private System.ComponentModel.Container components = null;

         public WebInstaller()

         {

              // 该调用是设计器所必需的。

              InitializeComponent();

              // TODO: 在 InitializeComponent 调用后添加任何初始化

         }

         /// <summary>

         /// 清理所有正在使用的资源。

         /// </summary>

         protected override void Dispose(bool disposing)

         {

              if(disposing)

              {

                   if(components != null)

                   {

                       components.Dispose();

                   }

              }

              base.Dispose(disposing);

         }

         #region 组件设计器生成的代码

         /// <summary>

         /// 设计器支持所需的方法 - 不要使用代码编辑器修改

         /// 此方法的内容。

         /// </summary>

         private void InitializeComponent()

         {

              components = new System.ComponentModel.Container();

         }

         #endregion

         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"

                       for(int intKeys=0;intKeys<keys.Length;intKeys++)

                       {

                            if(keys[intKeys].Equals("database"))

                                 stateSaver.Add("database", parameters[keys[intKeys]].

ToString());

                            else if(keys[intKeys].Equals("server"))

                                 stateSaver.Add("server", parameters[keys[intKeys]].

ToString());

                            else if(keys[intKeys].Equals("username"))

                                 stateSaver.Add("username", parameters[keys[intKeys]].

ToString());

                            else if(keys[intKeys].Equals("password"))

                                 stateSaver.Add("password", parameters[keys[intKeys]].

ToString());

                            else if(keys[intKeys].Equals("target"))

                                 stateSaver.Add("target", parameters[keys[intKeys]].

ToString());

                       }

                       //测试连接

                       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( "Data Source=" +

                                 stateSaver["server"].ToString() + ";Initial Catalog=master;

User Id=" + 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";

                       }

                       //把数据库连接字符串写进web.config文件.

                       XmlDocument doc = new XmlDocument();

                       doc.Load(stateSaver["target"].ToString() + @"Web.config");

                       XmlNode connectionNode = doc.SelectSingleNode(@"configuration/

appSettings/" + @"add[@key='DBConnString']");

                       if(connectionNode!=null)

                       {

                            connectionNode.Attributes["value"].Value = connectionstring;

                            doc.Save( stateSaver["target"].ToString() + @"Web.config");

                            //EventLog.WriteEntry("安装数据", "Configuration file

//processed...");

                            //MessageBox.Show("到这一步了吗?");

                       }

                       else

                       {// This error will ensure installation is uncomplete...

                            throw new InstallException("没有数据库连接串!");

                       }

                       //执行数据库脚本,安装数据库

                       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());

                       }

                       //MessageBox.Show("到这一步了吗?");

                       dbInstall.CreateDataBase();

                       dbInstall.InsertDate();

                       //部署桌面快捷方式

                       StreamWriter sw2=System.IO.File.CreateText(Context.Parameters["des"].

ToString()+"WebDBAccess.url");

stateSaver.Add("DeskQuick",Context.Parameters["des"].ToString()+

"WebDBAccess.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+"//images//shortcut.ico");

                       sw2.Flush();

                       sw2.Close();

                       //部署开始菜单

                       string startMenue=Environment.GetFolderPath(Environment.SpecialFolder

.StartMenu);

                       if(File.Exists(startMenue+"//WebDBAccess.url"))

                       {

                            if(MessageBox.Show("开始菜单已经存在,是否有覆盖它?","安装开始菜

",MessageBoxButtons.YesNo,MessageBoxIcon.Question,

                                 MessageBoxDefaultButton.Button1) == DialogResult.Yes)

                            {

File.Copy(Context.Parameters["des"].ToString()+"WebDBAccess

.url",startMenue+"//WebDBAccess.url",true);

                            }

                            else

                            {

                                 throw new InstallException("开始菜单已经存在,安装取消");

                            }

                       }

                       else

                       {

                            File.Copy(Context.Parameters["des"].ToString()+"WebDBAccess

.url",startMenue+"//WebDBAccess.url",false);

                       }

                       stateSaver.Add("StartMenueFile",startMenue+"//WebDBAccess.url");

//保存开始菜单文件绝对地址

                   }

              }

              catch(Exception ex1)

              {

                   throw new System.Configuration.Install.InstallException(ex1.ToString());

              }

         }

         public override void Uninstall(IDictionary savedState)

         {

              try

              {

                   if(savedState!=null)

                   {

                       base.Uninstall(savedState);

                       //删除桌面快捷方式,删除开始菜单快捷方式,删除数据库

                       //删除桌面快捷方式

                       if(File.Exists(savedState["DeskQuick"].ToString()))

                       {

                            File.Delete(savedState["DeskQuick"].ToString());

                       }

                       //删除开始菜单快捷方式

                       if(File.Exists(savedState["StartMenueFile"].ToString()))

                       {

                            File.Delete(savedState["StartMenueFile"].ToString());

                       }

                       //删除数据库

                       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();

                   }

                   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);

              }

         }

     }

}