当前位置:首页>>开发编程>>VS.NET>>新闻内容
VS.NET2005 web程序自定义安装包的制作
作者: 发布时间:2007-11-24 16:12:27 文章来源:

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

<configuration>
     ...

    <connectionStrings>
    <add name="myDataBase" connectionString="Database=testDataBase;Server=10.78.25.23;Uid=sa;Pwd=123;" providerName="System.Data.SqlClient"/>
    </connectionStrings>

    ...
       
</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”,然后右键 添加->新建项->安装程序类,建立一安装程序类如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.DirectoryServices;
using System.Reflection;
using System.Data;
using System.Data.SqlClient;
using System.Configuration.Install;
using System.Management;
using System.Collections;
using Microsoft.Win32;
using System.Collections.Specialized;

namespace SetupClassLibrary
{
    [RunInstaller(true)]
    public partial class MyInstaller : Installer
    {
        //先设置私有成员,对应安装程序里接收到的用户输入
        private string dbname;

        private string dbserver;

        private string user;

        private string pwd;

        private string iis;

        private string physicaldir;

        private string virtualdir;

        public static string VirDirSchemaName = "IIsWebVirtualDir";

        private string _target;

        private DirectoryEntry _iisServer;

        private ManagementScope _scope;

        private ConnectionOptions _connection;

        public MyInstaller()
        {
            InitializeComponent();
        }

        WriteWebConfig 修改web.config的连接数据库的字符串 WriteWebConfig 修改web.config的连接数据库的字符串

        private void WriteWebConfig()
        {
           //加载配置文件
            System.IO.FileInfo FileInfo = new System.IO.FileInfo(this.Context.Parameters["targetdir"] + "/web.config");
            if (!FileInfo.Exists)
            {
                throw new InstallException("缺少配置文件 :" + this.Context.Parameters["targetdir"] + "/web.config");
            }
            System.Xml.XmlDocument xmlDocument  = new System.Xml.XmlDocument();
            xmlDocument.Load(FileInfo.FullName);

           //修改连接字符串
            foreach (System.Xml.XmlNode Node in xmlDocument["configuration"]["connectionStrings"])
            {
                if (Node.Name == "add")
                {
                     if (Node.Attributes.GetNamedItem("name").Value == "myDataBase")
                    {
                        Node.Attributes.GetNamedItem( "connectionString").Value = String.Format("Database={0};Server={1};Uid={2};Pwd={3};", dbname, dbserver, user, pwd);
                      
                    }

                }
            }
                  
            xmlDocument.Save(FileInfo.FullName);

        }

        #endregion

        创建虚拟目录 创建虚拟目录

        private void CreateVirtualDir()
        {
            string constIISWebSiteRoot = "IIS://"+iis+"/W3SVC/1/ROOT";
            DirectoryEntry root  = new DirectoryEntry(constIISWebSiteRoot);

            DirectoryEntry tbEntry  = root.Children.Add(virtualdir, root.SchemaClassName);
            tbEntry.Properties["Path"][0] = physicaldir;//设置物理地址
            tbEntry.Invoke("AppCreate", true);
            //tbEntry.Properties["DefaultDoc"][0] = "Default.aspx";//设置起始页
            tbEntry.CommitChanges();

        }

        #endregion

        Install  从这里开始启动安装 Install  从这里开始启动安装

        public override void Install(IDictionary stateSaver)
        {

            base.Install(stateSaver);

            physicaldir = this.Context.Parameters["targetdir"].ToString();

            virtualdir = this.Context.Parameters["virtualdir"].ToString();

            dbname = this.Context.Parameters["dbname"].ToString();

            dbserver = this.Context.Parameters["dbserver"].ToString();

            user = this.Context.Parameters["user"].ToString();

            pwd = this.Context.Parameters["pwd"].ToString();

            iis = this.Context.Parameters["iis"].ToString();

            // 添加网站
           CreateVirtualDir();

            // 修改web.config
            WriteWebConfig();    

        }

        #endregion

        Uninstall 删除 Uninstall 删除

        public override void Uninstall(IDictionary savedState)
        {
           //添加自定义的卸载代码
            if (savedState == null)
            {
                throw new ApplicationException("未能卸载!");
            }

            else
            {
                base.Uninstall(savedState);
            }

        }

        #endregion

    }
}

  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目录下可看见生成的安装包。


最新更新
·当前上下文中不存在名称Conf
·请插入磁盘:Visual Studio 2
·用VS.NET读取Flash格式文件信
·在ASP.NET中使用AJAX的简单方
·VS.NET 2005中常用的一些代码
·安装VS.NET 2005 SP1补丁全攻
·ASP.NET后台代码实现XmlHttp
·ASP.NET取得当前页面的完整U
·如何在ASP.NET程序里面执行D
·IIS5IIS6IIS7的ASP.net请求处
相关信息
·当前上下文中不存在名称ConfigurationManager的解决方法
·请插入磁盘:Visual Studio 2005 DVD
·用VS.NET读取Flash格式文件信息
·VS.NET 2005中常用的一些代码
·安装VS.NET 2005 SP1补丁全攻略
·VS.NET 2005 常用的快捷键大全
·VS.NET2005智能感知失效的解决办法
·VS.NET 2005 + VSS6.0简单应用示例
·完全卸载Visual Studio 2008 Beta2的步骤
放生
愚爱
够爱
触电
白狐
心跳
知足
犯错
降临
分爱
葬爱
光荣
画心
火花
稻香
爱得起
这种爱
大丈夫
花蝴蝶
二缺一
小酒窝
下雨天
右手边
安静了
棉花糖
明天过后
边做边爱
擦肩而过
没有如果
怀念过去
等一分钟
越来越爱
寂寞暴走
你的承诺
Nobody
我们都一样
永远在身边
天使的翅膀
原谅我一次
i miss you
原谅我一次
吻的太逼真
姑娘我爱你
做你的爱人
一定要爱你
飞向别人的床
爱上别人的人
感动天感动地
心在跳情在烧
不潮不用花钱
如何能把你忘记
即使知道要见面
爱上你是一个错
最后一次的温柔
爱上你是我的错
怎么会狠心伤害我
亲爱的那不是爱情
伤心时候可以听情歌
爱上你等于爱上了错
不是因为寂寞才想你