利用VS2005的“Web安装项目”建立安装包很难对安装过程进行详细控制,因此直接采用“安装项目”来建立web程序安装包。我们需要安装过程中自动 创建虚拟目录,并且可以修改数据库连接字符串,假设我们在安装过程中需要用户修改web.config文件里连接字符串其形式如下:

 

VS2005 web程序自定义安装包的制作[转]_编程<configuration>
VS2005 web程序自定义安装包的制作[转]_编程     ...
VS2005 web程序自定义安装包的制作[转]_编程
VS2005 web程序自定义安装包的制作[转]_编程    
<connectionStrings>
VS2005 web程序自定义安装包的制作[转]_编程    
<add name="myDataBase" connectionString="Database=testDataBase;Server=10.78.25.23;Uid=sa;Pwd=123;" providerName="System.Data.SqlClient"/>
VS2005 web程序自定义安装包的制作[转]_编程    
</connectionStrings>
VS2005 web程序自定义安装包的制作[转]_编程
VS2005 web程序自定义安装包的制作[转]_编程    ...
VS2005 web程序自定义安装包的制作[转]_编程        
VS2005 web程序自定义安装包的制作[转]_编程
</configuration>

则建立安装包的过程如下:

1)发布网站:右键点击web项目,在弹出菜单里点击“发布网站”将它发布到本地机器。

2)新建安装项目:从菜单处依次点 文件->新建->文件->项目->其他项目类型->安装和部署->安装项目,输入名称与位置,并确定。在项目属性里设置相应的说明内容。

3)在启动项里添加文本框:右键点击项目,在弹出菜单里选择 视图->用户界面,出现用户界面的树形结构。右键点击“启动”节点,添加“文本框(A)”与“文本框(B)”,并将它们移动到“安装文件夹”之上。 这两个界面用来接收用户安装过程中输入的“web服务地址与虚拟目录”和“数据库连接字符串”。两个文本框的属性设置如下:

文本框(A)

BannerText:网站设置

BodyText:设置web服务地址与虚拟目录

Edit1Label:web服务器:

Edit1Property:IISSERVER  //这个是自己起的名字

Edit1Value:localhost  //此为默认值,可不设置

Edit1Visible:True

Edit2Label:虚拟目录:

Edit2Property:VIRTUALDIR   //这个是自己起的名字

Edit2Value:testWeb //此为默认值,可不设置

Edit2Visible:True

Edit3Visible:False

Edit4Visible:False

文本框(B)

BannerText:数据库设置

BodyText:设置数据库连接字符串

Edit1Label:数据库服务器:

Edit1Property:DBSERVERNAME   //这个是自己起的名字

Edit1Value:10.78.25.23    //此为默认值,可不设置

Edit1Visible:True

Edit2Label:数据库名称:

Edit2Property:DBNAME   //这个是自己起的名字

Edit2Value:testDataBase   //此为默认值,可不设置

Edit2Visible:True

Edit3Label:登录帐号:

Edit3Property:USERNAME   //这个是自己起的名字

Edit3Value:sa //此为默认值,可不设置

Edit3Visible:True

Edit4Label:登录密码:

Edit4Property:PASSWORD  //这个是自己起的名字

Edit4Value:

Edit4Visible:True

4)建立安装程序类:新建一c#类库项目“SetupClassLibrary”,然后右键 添加->新建项->安装程序类,建立一安装程序类如下:

 

VS2005 web程序自定义安装包的制作[转]_编程using System;
VS2005 web程序自定义安装包的制作[转]_编程
using System.Collections.Generic;
VS2005 web程序自定义安装包的制作[转]_编程
using System.ComponentModel;
VS2005 web程序自定义安装包的制作[转]_编程
using System.IO;
VS2005 web程序自定义安装包的制作[转]_编程
using System.DirectoryServices;
VS2005 web程序自定义安装包的制作[转]_编程
using System.Reflection;
VS2005 web程序自定义安装包的制作[转]_编程
using System.Data;
VS2005 web程序自定义安装包的制作[转]_编程
using System.Data.SqlClient;
VS2005 web程序自定义安装包的制作[转]_编程
using System.Configuration.Install;
VS2005 web程序自定义安装包的制作[转]_编程
using System.Management;
VS2005 web程序自定义安装包的制作[转]_编程
using System.Collections;
VS2005 web程序自定义安装包的制作[转]_编程
using Microsoft.Win32;
VS2005 web程序自定义安装包的制作[转]_编程
using System.Collections.Specialized;
VS2005 web程序自定义安装包的制作[转]_编程
VS2005 web程序自定义安装包的制作[转]_编程
VS2005 web程序自定义安装包的制作[转]_编程
namespace SetupClassLibrary
VS2005 web程序自定义安装包的制作[转]_编程_27VS2005 web程序自定义安装包的制作[转]_编程_28
{
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29    [RunInstaller(
true)]
VS2005 web程序自定义安装包的制作[转]_编程_29    
public partial class MyInstaller : Installer
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34    
{
VS2005 web程序自定义安装包的制作[转]_编程_29        
//先设置私有成员,对应安装程序里接收到的用户输入
VS2005 web程序自定义安装包的制作[转]_编程_29
        private string dbname;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private string dbserver;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private string user;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private string pwd;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private string iis;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private string physicaldir;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private string virtualdir;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
public static string VirDirSchemaName = "IIsWebVirtualDir";
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private string _target;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private DirectoryEntry _iisServer;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private ManagementScope _scope;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private ConnectionOptions _connection;
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
public MyInstaller()
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34        
{
VS2005 web程序自定义安装包的制作[转]_编程_29            InitializeComponent();
VS2005 web程序自定义安装包的制作[转]_编程_64        }

VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_34VS2005 web程序自定义安装包的制作[转]_编程_33        
WriteWebConfig 修改web.config的连接数据库的字符串 WriteWebConfig 修改web.config的连接数据库的字符串
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private void WriteWebConfig()
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34        
{
VS2005 web程序自定义安装包的制作[转]_编程_29           
//加载配置文件
VS2005 web程序自定义安装包的制作[转]_编程_29
            System.IO.FileInfo FileInfo = new System.IO.FileInfo(this.Context.Parameters["targetdir"+ "/web.config");
VS2005 web程序自定义安装包的制作[转]_编程_29            
if (!FileInfo.Exists)
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34            
{
VS2005 web程序自定义安装包的制作[转]_编程_29                
throw new InstallException("缺少配置文件 :" + this.Context.Parameters["targetdir"+ "/web.config");
VS2005 web程序自定义安装包的制作[转]_编程_64            }

VS2005 web程序自定义安装包的制作[转]_编程_29            System.Xml.XmlDocument xmlDocument 
= new System.Xml.XmlDocument();
VS2005 web程序自定义安装包的制作[转]_编程_29            xmlDocument.Load(FileInfo.FullName);
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29           
//修改连接字符串
VS2005 web程序自定义安装包的制作[转]_编程_29
            foreach (System.Xml.XmlNode Node in xmlDocument["configuration"]["connectionStrings"])
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34            
{
VS2005 web程序自定义安装包的制作[转]_编程_29                
if (Node.Name == "add")
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34                
{
VS2005 web程序自定义安装包的制作[转]_编程_29                    
if (Node.Attributes.GetNamedItem("name").Value == "myDataBase")
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34                    
{
VS2005 web程序自定义安装包的制作[转]_编程_29                        Node.Attributes.GetNamedItem(
"connectionString").Value = String.Format("Database={0};Server={1};Uid={2};Pwd={3};", dbname, dbserver, user, pwd);
VS2005 web程序自定义安装包的制作[转]_编程_29                       
VS2005 web程序自定义安装包的制作[转]_编程_64                    }

VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_64                }

VS2005 web程序自定义安装包的制作[转]_编程_64            }

VS2005 web程序自定义安装包的制作[转]_编程_29                   
VS2005 web程序自定义安装包的制作[转]_编程_29            xmlDocument.Save(FileInfo.FullName);
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_64        }

VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_64        
#endregion

VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_34VS2005 web程序自定义安装包的制作[转]_编程_33        
创建虚拟目录 创建虚拟目录
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
private void CreateVirtualDir()
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34        
{
VS2005 web程序自定义安装包的制作[转]_编程_29            
string constIISWebSiteRoot = "IIS://"+iis+"/W3SVC/1/ROOT";
VS2005 web程序自定义安装包的制作[转]_编程_29            DirectoryEntry root 
= new DirectoryEntry(constIISWebSiteRoot);
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            DirectoryEntry tbEntry 
= root.Children.Add(virtualdir, root.SchemaClassName);
VS2005 web程序自定义安装包的制作[转]_编程_29            tbEntry.Properties[
"Path"][0= physicaldir;//设置物理地址
VS2005 web程序自定义安装包的制作[转]_编程_29
            tbEntry.Invoke("AppCreate"true);
VS2005 web程序自定义安装包的制作[转]_编程_29            
//tbEntry.Properties["DefaultDoc"][0] = "Default.aspx";//设置起始页
VS2005 web程序自定义安装包的制作[转]_编程_29
            tbEntry.CommitChanges();
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_64        }

VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_64        
#endregion

VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_34VS2005 web程序自定义安装包的制作[转]_编程_33        
Install  从这里开始启动安装 Install  从这里开始启动安装
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
public override void Install(IDictionary stateSaver)
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34        
{
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            
base.Install(stateSaver);
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            physicaldir 
= this.Context.Parameters["targetdir"].ToString();
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            virtualdir 
= this.Context.Parameters["virtualdir"].ToString();
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            dbname 
= this.Context.Parameters["dbname"].ToString();
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            dbserver 
= this.Context.Parameters["dbserver"].ToString();
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            user 
= this.Context.Parameters["user"].ToString();
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            pwd 
= this.Context.Parameters["pwd"].ToString();
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            iis 
= this.Context.Parameters["iis"].ToString();
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            
// 添加网站
VS2005 web程序自定义安装包的制作[转]_编程_29
           CreateVirtualDir();
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            
// 修改web.config
VS2005 web程序自定义安装包的制作[转]_编程_29
            WriteWebConfig();     
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_64        }

VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_64        
#endregion
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_34VS2005 web程序自定义安装包的制作[转]_编程_33        
Uninstall 删除 Uninstall 删除
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29        
public override void Uninstall(IDictionary savedState)
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34        
{
VS2005 web程序自定义安装包的制作[转]_编程_29           
//添加自定义的卸载代码
VS2005 web程序自定义安装包的制作[转]_编程_29
            if (savedState == null)
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34            
{
VS2005 web程序自定义安装包的制作[转]_编程_29                
throw new ApplicationException("未能卸载!");
VS2005 web程序自定义安装包的制作[转]_编程_64            }

VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_29            
else
VS2005 web程序自定义安装包的制作[转]_编程_33VS2005 web程序自定义安装包的制作[转]_编程_34            
{
VS2005 web程序自定义安装包的制作[转]_编程_29                
base.Uninstall(savedState);
VS2005 web程序自定义安装包的制作[转]_编程_64            }

VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_64        }

VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_64        
#endregion
VS2005 web程序自定义安装包的制作[转]_编程_29
VS2005 web程序自定义安装包的制作[转]_编程_64    }

VS2005 web程序自定义安装包的制作[转]_编程_181}

 

5)添加项目输出

        编译生成“SetupClassLibrary”

        然后右键单击2)中建立的安装项目 添加->项目输出中选择“SetupClassLibrary”,选中“主输出”,单击“确定”。这样你可以在解决方案安装项目树中看见多了“主输出来自SetupClassLibrary(活动)”节点。

        再右键此安装项目 视图->自定义操作 中选择“安装”节点,右键 “添加自定义操作”,进入“应用程序文件夹”,选中“主输出来自SetupClassLibrary(活动)”,单击“确定。

        选中“安装”下的“主输出来自SetupClassLibrary(活动)”节点,在其属性窗口中设置CustomActionData 的值为 /dbname=[DBNAME] /dbserver=[DBSERVERNAME] /user=[USERNAME] /pwd=[PASSWORD] /iis=[IISSERVER]  /virtualdir=[VIRTUALDIR] /targetdir="[TARGETDIR]\",这是设置文本框(A)和文本框(B)中的输入与安装程序类中要访问的变量之间的对应关系,其中 targetdir="[TARGETDIR]\"代表应用程序安装目录(注意:各个对应关系之间必须用空格隔开)。

6)添加文件:这一步,我们将发布网站时生成的文件夹全部克隆到安装项目中。

右键安装项目,视图->文件系统 在“应用程序文件夹”下按发布网站时生成的文件夹里的结构添加文件夹与文件。

说明:

1.这些文件都需要我们从发布网站的文件夹里添加进来,比如一般需要建立对应的“bin”文件夹,并在里面添加对应的程序集文件,而且一般我们会在“应用程序文件夹”根下添加web.config文件。

2.这里的文件将被复制到目标计算机上,此安装项目将在目标计算机上建立虚拟目录指向此文件夹。

7)编译生成,OK! 到安装项目的debug或者release目录下可看见生成的安装包。