VS.NET2005 web程序自定义安装包的制作

2010-08-28 10:52:45来源:西部e网作者:

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

关键词:VS.NET

赞助商链接:

忐忑
浮夸
说谎
倾世
王妃
煎熬
武装
小三
曾经
素颜
惊叹号
爱很美
春天里
老男孩
皮影戏
走天涯
羽绒服
甩葱歌
套马杆
伤不起
有没有
苦咖啡
追梦人
那些年
大声唱
爱的供养
三寸天堂
荷塘月色
喜欢寂寞
爱情买卖
爱是你我
见或不见
火力全开
一念执着
想你的夜
依然爱你
幸福额度
红尘情歌
明天你好
狼的诱惑
你是我的眼
没那么简单
客官不可以
等你的季节
等不到的爱
美丽与勇敢
我的好兄弟
我们的歌谣
如果爱忘了
梦中的额吉
男人帮片尾曲
最重要的决定
不分手的恋爱
魔鬼中的天使
裸婚时代插曲
当我唱起这首歌
全世界宣布爱你
请安静的忘记我
亲爱的你在哪里
天龙八部之宿敌
爱情睡醒了主题曲
漂亮的姑娘就要嫁人啦
最接近天堂的地方
我爱你胜过你爱我
下辈子做你的女人