Web项目构建安装包,程序安装打包

探讨了半天。。。终于有一些名堂

web项目构建成安装包是为着便利发表到服务器上,本文首要讲了安装包制作,IIS安顿,数据库安装,卸载时去除IIS网址和数据库

WEB项目(B/S系统)打包安装程序总括

英特网教程,看了半天,这里也写一下温馨的勤奋路程

博文参照他事他说加以考察链接:

 

此处分二种情景打包

 

选取VS 自带的包装工具,制作webform安装项目 

处境:安装进程中必要修改webconfig或进行sql之类的

上边是笔者通过互连网资料和和煦的思虑计算进行增加补充,希望能对大家又所救助。

支付遭受:VS 二〇一〇 ,Ms sqlserver 二〇一〇(必须先安装),IIS(必须先安装)
    操作系统:Windows 7
    开采语言:C#
    项目名称:中央站

1.webapplication情况 简称A情况

 

概要:

打包安装程序的创设采用性还广大的,有installshield,wise installer,inno setup那多少个做打包安装项目都以很强劲的,要搞出界面大气本性化的设置,照旧得用那多少个才行,小编那篇说 的是.NET自带的装置项目打包WEB系统的,.NET打包安装项目即便傻傻的,也正如丑,可是搭建筑和安装装项目火速也能餍香港足球总会体的需要,若无丰硕的光阴钻探重量级的设置工具,长期内 用.NET自带的设置项目也是一个优秀的挑选。

使用vs二零一二打包安装时,使用visual studio installer projects ,下载地址

网络有好些个关于用.NET打包WEB项指标著作,大借使那么的,但不是很完美,有分别细节并不曾关联,先说下那一个设置打包项目标关键功效:

2.website情况  简称B情况

率先大家须求一个早就发布的网址

安装类的认证

   一、安装前系统一检查测注重检验SQL SE中华VVEKuga是或不是安装,站点名称和端口号是或不是再度等,framework自动物检疫查实验未有的话先安装,本身自带就有此功效,IIS是必需须要的,不然没办法创制站点。

   二、项目文件安装到钦点文件夹并基于安装时的数据库布局修改webconfig连接

   三、附加数据库:打包时能够把mdf文件放到WEB项目文件夹下,生成安装文件时就能够自动打包进去,安装时施行附加就可以。

   四、注册COM组件(假诺项目中提到到COM的话)

   五、创建WEB站点

   六、创造设想目录

     这里的虚构近来是依赖打包的花色须要张开的,因为部分WEB项目布局相比较复杂,举个例子一个类别除去本人项指标昭示文件,还大概有其它的独立特殊效果的品类作为设想目录的款式联手运营,     类似于插拔式的插件同样,须要的话直接拷贝到站点下,设置设想目录,系统菜单做好链接指向其页面就能够了。

   七、成立桌面火速方式

     举个例子能够把系统的报到页面或其余起首页作为安装时钦赐的火速格局

   八、项目卸载

     项指标卸载首要蕴涵删除项目文件,卸载附加的数据库,删除站点及桌面急忙格局等

大比非常多操作,就在天涯论坛搜,就有答案了

一、安装包制作

设置类代码表明

安装WEB项指标前提条件是需求在客商Computer上先安装SQL SERAV4VEENCORE数据库(或其余数据库)和IIS消息管理器。

     1)安装项目首要涉及的是安装类里面包车型客车操作,包含安装和卸载的方式重写等,安装时索要记录客户通过安装分界面输入的新闻,这里大家得以用XML文件作为记录配置文件,重借使在卸载的时候须要选用客户输入的连带音信,数据库连接串的记录操作如下:

     

     /// <summary>
        /// 获取数据库登陆连接字符串
        /// </summary>
        /// <param name="databasename">数据库名称</param>
        /// <returns></returns>
        private string GetConnectionString(string databasename)
        {
            string ConnStr = "server="   Context.Parameters["server"].ToString()   ";database="   (string.IsNullOrEmpty(databasename) ? "master" : databasename)   ";uid="   Context.Parameters["user"].ToString()   ";pwd="   Context.Parameters["pwd"].ToString();
            if (string.IsNullOrEmpty(databasename)) //将连接串写入XML文件,供卸载操作时读取
            {
                dbpath = Path.Combine(this.Context.Parameters["installdir"].ToString(), "dbconfig.xml");
                OperateXML.UpdateXMLNode(dbpath, "ConnString", ConnStr);
            }
            else
            {
                dbpath = Path.Combine(this.Context.Parameters["installdir"].ToString(), "dbconfig.xml");
                OperateXML.UpdateXMLNode(dbpath, "DbName", databasename);
            }
            return ConnStr;
        }

        2)安装检验

     /// <summary>
        /// 剖断是或不是安装了SQL SE锐界VEEnclave
        /// </summary>
        /// <returns></returns>
        private bool ExistSqlServerService()
        {
            bool Exist = false;
            ServiceController[] service = ServiceController.GetServices();
            for (int i = 0; i < service.Length; i )
            {
                if (service[i].ServiceName.Length > 5 && service[i].ServiceName.Substring(0, 5) == "MSSQL") //if (service[i].ServiceName == "MSSQLSERVER")
                {
                    Exist = true;
                    break;
                }
            }
            return Exist;
        }

       这里是遵照服务名称决断的,即使是SQLSEEnclaveVE纳瓦拉 EXPRESS版的话,服务名是MSSQL$EXPRESS,别的的数据库实例也是MSSQL$ 实例名

     /// <summary>
        /// 检查评定IIS及版本号
        /// </summary>
        /// <returns></returns>
        public string GetIISVerstion()
        {

            RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWAREMicrosoftINetStp");
            if (key == null)
                return string.Empty;
            else
                return Convert.ToString(key.GetValue("MajorVersion"))   "."   Convert.ToString(key.GetValue("MinorVersion"));

        }

 

     string entPath = String.Format("IIS://{0}/w3svc", "localhost");

        /// <summary>
        /// 端口号是不是再一次
        /// </summary>
        /// <returns></returns>
        private bool IsExistSitePort()
        {
            bool exist = false;
            DirectoryEntry ent = GetDirectoryEntry(entPath);
            foreach (DirectoryEntry child in ent.Children)
            {
                if (child.SchemaClassName == "IIsWebServer")
                {
                    if (child.Properties["ServerBindings"].Value != null && child.Properties["ServerBindings"].Value.ToString().Split(':').Length > 1)
                    {
                        if (child.Properties["ServerBindings"].Value.ToString().Split(':')[1] == Context.Parameters["siteport"].ToString())
                        {
                            exist = true;
                            break;
                        }
                    }
                }
            }
            return exist;
        }

   child.Properties["ServerBindings"].Value 是绑定属性,其实正是下面这一个图里的质量

                        

图片 1

   但是有个别站点恐怕会分配多个端口,child.Properties["ServerBindings"].Value 就是 System.Object[] 字符

 

图片 2

        /// <summary>
        /// 站点名称是不是存在
        /// </summary>
        /// <returns></returns>
        private bool IsExistSiteName(string sitename)
        {
            bool exist = false;
            using (DirectoryEntry root = new DirectoryEntry(entPath))
            {
                foreach (DirectoryEntry Child in root.Children)
                {
                    if (Child.SchemaClassName == "IIsWebServer")
                    {
                        string WName = Child.Properties["ServerComment"].Value.ToString();
                        if (sitename == WName)
                        {
                            exist = true;
                            break;
                        }
                    }
                }
                root.Close();
            }
            return exist;
        }

         3)安装并复制文件

           复制文件的操作在OnBeforeInstall方法中就曾经产生,在该措施中得以替换数据库连接字符串操作等。

 protected override void OnBeforeInstall(IDictionary savedState)
        {
            if (ExistSqlServerService())
            {
                if (IsExistSitePort())
                {
                    MessageBox.Show("站点端口号重复", "音讯指示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (IsExistSiteName(Context.Parameters["sitename"].ToString()))
                {
                    MessageBox.Show("站点名称再一次", "消息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                base.OnBeforeInstall(savedState);

                unRAHighlander("Message.rar"); //解压文件
                unRAR("MoreUpload.rar");
                /*
                 * 设置webconfig连接字符串
                 */
                string webconfigpath = Path.Combine(this.Context.Parameters["installdir"].ToString(), "Web.config");
                string webcofnigstring = File.ReadAllText(webconfigpath).Replace("#constring#", GetConnectionString(Context.Parameters["dbname"].ToString()));
                webcofnigstring = webcofnigstring.Replace("#siteport#", Context.Parameters["siteport"].ToString());
                webcofnigstring = webcofnigstring.Replace("#comConn#", "Provider=SQLOLEDB.1;Persist Security Info=False;User ID="   Context.Parameters["user"].ToString()   ";Password="   Context.Parameters["pwd"].ToString()   ";Initial Cat alog="   Context.Parameters["dbname"].ToString()   ";Data Source="   Context.Parameters["server"].ToString());
                File.WriteAllText(webconfigpath, webcofnigstring);

                ////安装IIS
                //if (string.Empty == GetIISVerstion())
                //{
                //    IISInstall(this.Context.Parameters["installdir"].ToString()   "IIS6.0_XPSP3", this.Context.Parameters["installdir"].ToString()   "iis.txt");
                //}

            }
            else
            {
                MessageBox.Show("检查评定到你的Computer没有设置SQL SE奥迪Q7VELacrosse,无法持续设置此产品", "音讯提示", MessageBoxButtons.OK, Message博克斯Icon.Warning);
                this.Rollback(savedState);
            }

        }

       上面代码中解压了四个公文,首借使在设置完创设站点时还供给成立虚构目录。之所以要先削减放到WEB项目里,是因为变化安装程序时会检查评定类其余变迁是不是成功(是或不是能够不让它检查实验成功吧? 还不知情),一般借使大家把发表好的门类COPY到新建项目下就足以,不过单独的品种文件夹有友好独自的bin目录和webconfig文件,是无法混合在一块儿生成成功的,但是又需求一遍完全安装,那么能够先削减做为WEB项目下的公文,待复制完后再解压。

     4)安装

    /// <summary>
        /// 安装
        /// </summary>
        /// <param name="stateSaver"></param>
        public override void Install(IDictionary stateSaver)
        {
            if (ExistSqlServerService())
            {
                if (IsExistSitePort())
                {
                    MessageBox.Show("站点端口号重复", "信息提示", Message博克斯Buttons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (IsExistSiteName(Context.Parameters["sitename"].ToString()))
                {
                    MessageBox.Show("站点名称再一次", "音讯提醒", MessageBoxButtons.OK, Message博克斯Icon.Warning);
                    return;
                }

                base.Install(stateSaver);

                WriteBat();
                RegisterCom();
                string connectionString = GetConnectionString(null);
                try
                {
                    using (SqlConnection connection = new SqlConnection(connectionString))
                    {
                        connection.Open();

                        string sql = "sp_attach_db '"   Context.Parameters["dbname"].ToString()   "','"   Context.Parameters["installdir"].ToString()   "App_Data/Db_Data.MDF','"
                              Context.Parameters["installdir"].ToString()   "App_Data/Db_Data_Log.LDF'";

                        ExecuteSQL(connection, sql);
                        connection.Close();
                    }

                }
                catch (Exception ex)
                {
                    MessageBox.Show("数据库安装退步!n数据库配置有误,请正确配置音讯!n"   ex.Message, "出错!");
                    this.Rollback(stateSaver);
                    return;
                }

                try
                {
                    CreateDeskTopShortcut();
                    NewWebSiteInfo siteInfo = new NewWebSiteInfo(string.Empty, Context.Parameters["siteport"].ToString(), "", Context.Parameters["sitename"].ToString(), Context.Parameters["installdir"].ToString());
                    CreateNewWebSite(siteInfo);
                    StartWebSite(siteInfo.BindString);

                }
                catch//(Exception ex)
                {
                    //MessageBox.Show("制造站点失利!n"   ex.Message, "出错!");
                    //this.Rollback(stateSaver);
                     CreateVirWebSite("Message", Context.Parameters["installdir"].ToString()   "Message");
                     CreateVirWebSite("MoreUpload", Context.Parameters["installdir"].ToString()   "MoreUpload");
                }
            }
            else
            {
                MessageBox.Show("检验到你的微管理器未有设置SQL SEEnclaveVE宝马X5,不可能持续设置此产品", "音讯提醒", Message博克斯Buttons.OK, Message博克斯Icon.Warning);
                this.Rollback(stateSaver);
            }

        }

        创造好网址后调用CreateVirWebSite方法制造设想目录。

       5)安装时客户参数接收

          参数的称呼在抬高安装项指标视图-》客商分界面里填充, 

        参数的传递在视图——》自定义操作里面安装,如下图:

          

图片 3

       在CustomActionData里输入全数必要传递到安装类的参数   /dbname=[DBNAME] /server=[SERVER] /user=[UID] /pwd=[PWD] /sitename=[SITENAME] /siteport=[SITEPORT]   /startpage=[STARTPAGE] /shortcutname=[SHORTCUTNAME] /installdir="[TARGETDIR]"  注意这几个格式是定位的,尤其安装路线的参数格式installdir="[TARGETDIR]"这么写

      同有时间要验证的是在卸载的CustomActionData属性只必要付出installdir参数,即便给了别的的参数,卸载时也是读取不到的,只能读取到起来的默许值,假若设置进度中顾客重新修 改了就老大了,安装文件时选取的门路始终能科学读取到,正因为这么在装置时须求把录入的连锁新闻以XML配置文件的款型记录下来,那样才干保证科学正确的卸载。

        6)卸载

         因为解压产生的公文卸载时不会活动删除,须求独自编写制定代码删除,那些文件是设置进度中产生的次生文件,它只会活动删除原来WEB项目打包进去的原来文件,至于其余发生的公文是不会自动删除的。对于解压后的文件举办操作,这里也可以有个三个亟要求潜心的地点,正是路径难点,解压产生的次生文件,安装时会读取不到解压后的公文夹路径,事实上文件已经复制解压也到位了,但正是读取不到,对应这种场所办法是创立二个和缩短包一样的空文件夹放到WEB项目里,要是解压后的公文里必要替换webconfig连接串,能够在文件夹里归入Web.xml文件,并设置好要替换的地点,后面说了七个webconfig生成会不成功,这里能够先取名xml,解压后替换连接串再修改文件名OK了。

    /// <summary
        /// 卸载 
        /// </summary>
        /// <param name="savedState"></param>
        public override void Uninstall(IDictionary savedState)
        {
            DeleteWebSite(); //删除安装文件前先删除站点,因删除站点时需读取安装文件的陈设消息
            dbpath = Path.Combine(this.Context.Parameters["installdir"].ToString(), "dbconfig.xml");
            string connectionString = OperateXML.GetXmlNodeValue(dbpath, "ConnString");
            string dbName = OperateXML.GetXmlNodeValue(dbpath, "DbName");

            base.Uninstall(savedState);
            
            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    string sql = "if exists(select 1 from master..sysdatabases where name= '"   dbName   "') drop database "   dbName;
                    ExecuteSQL(connection, sql);
                    connection.Close();
                }
                if (Directory.Exists(Context.Parameters["installdir"].ToString()   "Message"))
                {
                    Directory.Delete(Context.Parameters["installdir"].ToString()   "Message", true);//删除解压产生的文书

                }
                if (Directory.Exists(Context.Parameters["installdir"].ToString()   "MoreUpload"))
                {
                    Directory.Delete(Context.Parameters["installdir"].ToString()   "MoreUpload", true);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show("卸载退步!n"   ex.Message, "音信提醒", Message博克斯Buttons.OK, MessageBoxIcon.Warning);
                this.Rollback(savedState);
                return;
            }

        }

好了,安装类表明已经基本上了,未来遵守VS里实操步骤来上课下

这里讲下作者蒙受的难题

 展开网址

步骤:

    第一步:展开开辟情况VS2010,新建项目,采用其余门类项目,再选拔"web安装项目",输入名称及挑选安装路线;(其实选取设置项目而非web安装项目也未有时)

 

图片 4

    第二步:步向文件系统选项卡,选用应用程序文件夹,在中游的空域区域右键选择"添Gavin件",增添品种相关文件

注:增加的文本最棒是发表的文本,.cs的公文不要包含在内(假设文件夹太多,可直接复制,并粘帖到文件系统对应的文书夹下)

 

图片 5

其三步:设置系统必备,右键接纳安装项目,步入属性页中,单击"系统必备"按键,步向系统必备对话框;勾选"创立用于安装系统必备组件的安装程序",在安装系统必备组件列表中,选拔

            1)、Windows Installer 3.1(必选)
            2)、.NET Framework 3.5 (可选)参照他事他说加以考察最终验明正身
            3)、Crystal Report Basic for Visual Studio二零零六(x86,x64) (可选) 项目中用到了水晶报表就须要勾选此项

关键一点:勾选"从与本身的应用程序一样的地点下载系统必备组件(D)",其实意思就是说你勾选后,生成安装项目时,在您安装项指标不二等秘书诀下,会有你在系统必备组件列表中勾选的组件.(系统活动达成,那或多或少尚可,不须求你和煦去下载组件)

 

图片 6

第四步:更换安装程序属性,右键选取安装项目性质,能够安装项目小编及称谓,别的质量音信方可依附实际境况张开设置.

 

第五步: 创造安装程序类

在缓慢解决方案能源处理器中,新建二个类库项目【DBInstaller】,删除Class1.cs,新建多个安装程序类[DBInstaller.cs],具体安装类的代码在作品尾附上

 

图片 7

第六步: 创造自定义安装对话框
在刚新建的安装项目上右键,【视图】->【客户分界面】:

 

 

图片 8

在客户分界面中,右键【运维】-【增添对话框】-选取【文本框(A)】-鲜明。
然后右键那几个文本框(A),将其长进到迎接使用下边:(那点比较重大)

 

图片 9

图片 10

右键选择【属性】,仿效下图的新闻填写:

 

 

 备注:如若还或者有一对自定义的品质要写,可以添Gavin件框,....

增加许可切磋(可选)在word里先创设好合同书的rtf文件,在此间浏览引用就行

在刚新建的装置项目上右键,【视图】->【自定义操作】:
右键【自定义操作界面】的【安装】节点,【增添自定义操作】,弹出的对话框。
在追寻范围里甄选应用程序文件夹,再点击侧面的【增添输出(O)…】,选用刚新建的安装程序类项目,私下认可依然主输出,鲜明。此时:

 

图片 11

 

10.右键那几个【主输出来自DBInstasller(活动)】,走入属性分界面,在【CustomActionData】属性里输入上面包车型客车内容:

/dbname=[DBNAME] /server=[SERVER] /user=[UID] /pwd=[PWD] /sitename=[SITENAME] /siteport=[SITEPORT] /startpage=[STARTPAGE] /shortcutname=[SHORTCUTNAME]  /installdir="[TARGETDIR]"
  表明:在那之中前多少个方括号中的大写字母,为地点第6步图中输入的三个EditProPerty属性,须求对应好。最终一个targetdir的值的情致是安装后文件的目录路线。
  特别提示:前边各因素之间个"/XXX=[XXX]"后边  ,都有多少个空格的

备考:那几个很要紧,复制过去后最权威动去掉空格后再添三个空格,注意最终TA哈弗GETDI哈弗 写法区别, 不要转移,不然程序里这一个设置的参数读取不到值,安装会战败

迄今甘休安装程序就弄好了,生成下安装项目就能够调换安装文件

注1:在生成人中学假如现身应将 qedit.dll排除错误,能够在装置项目-检验到的借助项里把qedit.dll排除就能够

注2:在设置进度中冒出 "Error 1001. 在早先化安装时发生至极system.badImageFormatException 未能加载文件或程序集 *** 生成此程序集的运作时比近期加载的运作时新,无法加载此程序集"错误,

化解办法:首先保障安装类的输出指标为 any cpu,安装项目为x86,本身在产出此错误时是因为数据库安装类 DBInstall类的.net框架的版本为4.0,安装项指标本子为aspnetversion 4.0(即4.0)的框架,把 DBInstall类的.net框架的版本改为2.0后重新生成的安装文件安装就能够符合规律。

品种安装下载地址

一:要修改webconfig之类的,将要加多Install安装类,在B情形下,加多新项里平素未有Install类,太阳三个,就那几个,郁闷了笔者十分久....最终解决办法是,新建四个类库,类Curry只放一个Install类

图片 12

二:对于A景况和B意况,都引用Install项目,于是最终的出口,都会多了一个Install.dll,小编商量了半天,也不能不出口它.

接下来右键施工方案》增多》新建项目》其余门类项目》安装和安顿》Visual Studio Installer 》安装项目

于是,只能想了个歪招,在Appliction_start事件里把Install.dll删了

在web项目里新建贰个装置项目,如图:

三:对于B情状,公布网址会有过多DLL,很弄成七个,这些用下插件就行了,不会就看下那网站:

图片 13

在新建的设置项目,右键安装项目》增加》项目输出,如图:

当然了,关键的标题不是其一,而是充分后的品类,会有“已预编写翻译此应用程序”那错误,那标题也忽悠了自己十分久。

图片 14

斩草除根的方法是:发表后的网址,把“PrecompiledApp.config”剪切出去,然后在装置项目里,以文件的格局别的增加

选拔品种输出,选用要操作的品种,如图:

 

图片 15

难点截至了。。。。。

演示项目是贰个web网址,所以独有贰个剧情文件输出选项,选中内容文件点击明显

 

假使示例项目是一个Web项目,则选取主输出,如下图:

图片 16

 

近日我们来制作安装包的装置分界面,如图选用顾客分界面:

图片 17

图片 18

右键运转,增加对话框,如图:

图片 19

此处能够根据安装项目标急需来摘取设置。

此地大家选拔文本框(A)、文本框(B)、许可合同

图片 20

拖动对话框实行排序——对话框的排序代表着安装时分界面顺序。

然后我们在文件系统》应用程序文件夹,侧面空白处右键》加多》文件,增多license.rtf文件 ,如图:

图片 21

图片 22

 

 未来我们重临顾客分界面,选拔顾客公约对话框-属性

能够看来LicenseFile未有值,将刚增添进的license.rtf文件增多进去

图片 23

选拔应用程序文件夹

图片 24

 

 由于在装置进度也急需设置数据库,所以大家还亟需让安装顾客在安装进度中输入数据库服务器音信,选择对话框(A)-属性,设置如图:

图片 25

此处大家只需求服务器、账号、密码,所以Edit4Visible设为false.

鉴于在安装进程中也亟需安装IIS,所以还索要让安装客户在设置进程中输入网址配置,选用对话框(B)-属性,设置如图:

图片 26

Value中的值皆感觉私下认可值

 由于大家须求配备数据库和iis,所以大家要求在新建四个类库(upLibrary1和unLibrary1),各自增添四个安装程序类(增添的安装程序类是一个持续installer的类),如图:

图片 27

图片 28

其间upLibrary1类库是设置,unLibrary1类库是卸载。

现行反革命大家在装置项目Setup增添那四个类库,右键》增加》项目输出》采纳upLibrary1类库和unLibrary1类库》选拔主输出

图片 29

添加后

图片 30

下一场右键安装项目》自定义操作》右键安装》增添自定义操作》应用程序文件夹

图片 31

选择主输出来自upLibrary1(活动)

图片 32

卸载中选取主输出来自unLibrary1(活动)

 接下来大家须要在装置进度传递输入的数量传递这几个项目中,选拔主输出来自upLibrary1(活动),右键属性,如图:

图片 33

属性框中的CustomActionData正是点名要传送到安装程序的自定义数据。

/server="'[EDITA1]'"  /user="'[EDITA2]'" /pwd="'[EDITA3]'" /iis="[IISSERVER]"  /ip="[IP]" /port="[PORT]"  /ISNAME="[ISNAME]" /targetdir="[TARGETDIR]"

/targetdir="[TARGETDIR]"中的“”记得不要丢了

 

明天我们回来upLibrary1安装程序类:

大家先讲upLibrary1类库,先不管unLibrary1类库

开荒upInstaller1类是三个企划视图,点击 单击此处切换来代码视图

图片 34

在设置程序类里大家得以写安装进程中的处总管件,举例附加数据库,将网址揭露到iis上。

第一大家先从写Install方法:

public override void Install(IDictionary stateSaver){  //这里面正是大家的根本代码区      }

在Install方法中大家得以接过装置进程中输出的数码新闻,如下:

图片 35

代码块:

安装:

内部包罗数据库的附加、连接iis服务器、判定网站是或不是留存、增多网址

图片 36图片 37

  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.ComponentModel;
  5 using System.Configuration.Install;
  6 using System.Linq;
  7 using System.Data.SqlClient;
  8 using System.Management;
  9 using System.IO;
 10 using System.Security.AccessControl;
 11 using System.DirectoryServices;
 12 
 13 
 14 namespace upLibrary1
 15 {
 16     [RunInstaller(true)]
 17     public partial class upInstaller1 : System.Configuration.Install.Installer
 18     {
 19         public upInstaller1()
 20         {
 21             InitializeComponent();
 22         }
 23 
 24         string iis = "";
 25         string port = "";
 26         private string _target;
 27         private string ISNAME;
 28         private string targetdir;  //安装地址
 29         private DirectoryEntry _iisServer;
 30         private ManagementScope _scope;
 31         private ConnectionOptions _connection;
 32 
 33         public override void Install(IDictionary stateSaver)
 34         {
 35 
 36             base.Install(stateSaver);
 37             string databaseServer = Context.Parameters["server"].ToString();  //数据库服务器
 38             //string databasename = Context.Parameters["dbname"].ToString(); 
 39             string userName = Context.Parameters["user"].ToString();  //账号
 40             string userPass = Context.Parameters["pwd"].ToString();  //密码
 41             string targetdir = Context.Parameters["targetdir"].ToString();   //安装地址
 42             iis = this.Context.Parameters["iis"].ToString();  //服务器
 43             string ip = this.Context.Parameters["ip"].ToString();  //ip
 44             port = this.Context.Parameters["port"].ToString();  //端口
 45             ISNAME = this.Context.Parameters["ISNAME"].ToString();  //网站名
 46 
 47             string serverID = "66";  //和iis上的网站ID不可重复
 48             try
 49             {
 50                 //System.Diagnostics.Debugger.Launch();   //调试代码
 51                 Connect();
 52                 string serverComment = ISNAME;
 53                 string defaultVrootPath = this.Context.Parameters["targetdir"];
 54                 if (defaultVrootPath.EndsWith(@""))
 55                 {
 56                     defaultVrootPath = defaultVrootPath.Substring(0, defaultVrootPath.Length - 1);
 57                 }
 58                 string HostName = "";
 59                 string IP = ip;
 60                 string Port = port;
 61                 string sReturn = CreateWebSite(serverID, serverComment, defaultVrootPath, HostName, IP, Port);
 62 
 63                 //给文件添加"Authenticated Users,Everyone,Users"用户组的完全控制权限  
 64                 if (File.Exists(Context.Parameters["targetdir"].ToString()   "App_Data\jiaowuDB.mdf"))
 65                 {
 66                     FileInfo fi = new FileInfo(Context.Parameters["targetdir"].ToString()   "App_Data\jiaowuDB.mdf");
 67                     System.Security.AccessControl.FileSecurity fileSecurity = fi.GetAccessControl();
 68                     fileSecurity.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow));
 69                     fileSecurity.AddAccessRule(new FileSystemAccessRule("Authenticated Users", FileSystemRights.FullControl, AccessControlType.Allow));
 70                     fileSecurity.AddAccessRule(new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow));
 71                     fi.SetAccessControl(fileSecurity);
 72                     FileInfo fi1 = new FileInfo(Context.Parameters["targetdir"].ToString()   "App_Data\jiaowuDB.ldf");
 73                     System.Security.AccessControl.FileSecurity fileSecurity1 = fi1.GetAccessControl();
 74                     fileSecurity1.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow));
 75                     fileSecurity1.AddAccessRule(new FileSystemAccessRule("Authenticated Users", FileSystemRights.FullControl, AccessControlType.Allow));
 76                     fileSecurity1.AddAccessRule(new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow));
 77                     fi1.SetAccessControl(fileSecurity1);
 78                 }
 79 
 80                 string connectionString = GetConnectionString(null);
 81                 //保存数据连接词,为卸载做准备
 82                 File.WriteAllText(Path.Combine(targetdir   "App_Data\", "log.txt"), connectionString);
 83                 try
 84                 {
 85                     using (SqlConnection connection = new SqlConnection(connectionString))
 86                     {
 87                         connection.Open();
 88                         //使用数据库文件创建数据库,所以添加的网站项目中需要有App_Data文件夹和数据库文件(jiaowuDB.mdf)和日志文件(jiaowuDB.ldf)
 89                         string sql = "sp_attach_db 'jiaowuDB','"   Context.Parameters["targetdir"].ToString()   "App_Data\jiaowuDB.mdf','"
 90                       Context.Parameters["targetdir"].ToString()   "App_Data\jiaowuDB.ldf'";
 91                         ExecuteSQL(connection, sql);
 92                         connection.Close();
 93                         //修改config文件连接词
 94                         string webconfigpath = Path.Combine(this.Context.Parameters["targetdir"].ToString(), "web.config");
 95                         string webcofnigstring = File.ReadAllText(webconfigpath).Replace("#constring#", GetConnectionString("jiaowuDB"));
 96                         File.WriteAllText(webconfigpath, webcofnigstring);
 97 
 98                     }
 99                 }
100                 catch (Exception e)
101                 {
102                     throw new Exception(e.Message);
103                 }
104             }
105             catch (Exception ex)
106             {
107                 base.Rollback(stateSaver);
108                 
109                 throw new Exception(ex.Message);
110             }
111         }
112 
113         #region Connect 连接IIS服务器
114         public bool Connect()
115         {
116 
117             if (iis == null)
118                 return false;
119             try
120             {
121                 _iisServer = new DirectoryEntry("IIS://"   iis   "/W3SVC/1");
122                 _target = iis;
123                 _connection = new ConnectionOptions();
124                 _scope = new ManagementScope(@"//"   iis   @"/root/MicrosoftIISV2", _connection);
125                 _scope.Connect();
126             }
127             catch
128             {
129 
130                 return false;
131             }
132             return IsConnected();
133         }
134 
135         public bool IsConnected()
136         {
137             if (_target == null || _connection == null || _scope == null) return false;
138             return _scope.IsConnected;
139         }
140         #endregion
141 
142         #region CreateWebsite 添加网站
143         public string CreateWebSite(string serverID, string serverComment, string defaultVrootPath, string HostName, string IP, string Port)
144         {
145             try
146             {
147                 ManagementObject oW3SVC = new ManagementObject(_scope, new ManagementPath(@"IIsWebService='W3SVC'"), null);
148 
149                 if (IsWebSiteExists(serverID))
150                 {
151                     throw new Exception("服务器上已存在"   ISNAME);
152                 }
153 
154                 ManagementBaseObject inputParameters = oW3SVC.GetMethodParameters("CreateNewSite");
155                 ManagementBaseObject[] serverBinding = new ManagementBaseObject[1];
156                 serverBinding[0] = CreateServerBinding(HostName, IP, Port);
157                 inputParameters["ServerComment"] = serverComment;
158                 inputParameters["ServerBindings"] = serverBinding;
159                 inputParameters["PathOfRootVirtualDir"] = defaultVrootPath;
160                 inputParameters["ServerId"] = serverID;
161 
162                 ManagementBaseObject outParameter = null;
163                 outParameter = oW3SVC.InvokeMethod("CreateNewSite", inputParameters, null);
164 
165                 // 启动网站
166                 //string serverName = "W3SVC/"   serverID;
167                 //ManagementObject webSite = new ManagementObject(_scope, new ManagementPath(@"IIsWebServer='"   serverName   "'"), null);
168                 //webSite.InvokeMethod("Start",  new object[] {});
169 
170                 return (string)outParameter.Properties["ReturnValue"].Value;
171             }
172             catch (Exception ex)
173             {
174                 throw new Exception(ex.Message);
175             }
176         }
177 
178         public ManagementObject CreateServerBinding(string HostName, string IP, string Port)
179         {
180             try
181             {
182                 ManagementClass classBinding = new ManagementClass(_scope, new ManagementPath("ServerBinding"), null);
183                 ManagementObject serverBinding = classBinding.CreateInstance();
184                 serverBinding.Properties["Hostname"].Value = HostName;
185                 serverBinding.Properties["IP"].Value = IP;
186                 serverBinding.Properties["Port"].Value = Port;
187                 serverBinding.Put();
188                 return serverBinding;
189             }
190             catch
191             {
192                 return null;
193             }
194         }
195         #endregion
196 
197         #region IsWebSiteExists 判断网站是否已经存在
198         public bool IsWebSiteExists(string serverID)
199         {
200             try
201             {
202                 string siteName = "W3SVC/"   serverID;
203                 ManagementObjectSearcher searcher = new ManagementObjectSearcher(_scope, new ObjectQuery("SELECT * FROM IIsWebServer"), null);
204 
205                 ManagementObjectCollection webSites = searcher.Get();
206                 foreach (ManagementObject webSite in webSites)
207                 {
208                     if ((string)webSite.Properties["Name"].Value == siteName)
209                         return true;
210                 }
211 
212                 return false;
213             }
214             catch
215             {
216                 return false;
217             }
218         }
219         #endregion
220 
221         /// <summary>
222         /// 执行sql语句
223         /// </summary>
224         /// <param name="connection"></param>
225         /// <param name="sql"></param>
226         void ExecuteSQL(SqlConnection connection, string sql)
227         {
228             SqlCommand cmd = new SqlCommand(sql, connection);
229             cmd.ExecuteNonQuery();
230         }
231 
232 
233         /// <summary>
234         /// 获取数据库登录连接字符串
235         /// </summary>
236         /// <param name="databasename">数据库名称</param>
237         /// <returns></returns>
238         private string GetConnectionString(string databasename)
239         {
240             return "server="   Context.Parameters["server"].ToString()   ";database="   (string.IsNullOrEmpty(databasename) ? "master" : databasename)   ";User ID="   Context.Parameters["user"].ToString()   ";Password="   Context.Parameters["pwd"].ToString();
241         }
242 
243     }
244 }

View Code

Web项目的数据库连接都是在Web.config中的,所以安装过程还要修改Web.config的数据库连接,这里使用简单的替换。

如下:

1 //修改config文件连接词
2 string webconfigpath = Path.Combine(this.Context.Parameters["targetdir"].ToString(), "web.config");
3 string webcofnigstring = File.ReadAllText(webconfigpath).Replace("#constring#", GetConnectionString("jiaowuDB"));
4 File.WriteAllText(webconfigpath, webcofnigstring);
5 
6 //Web 项目中WebConfig中配置
7 <add name="ConnectionString" connectionString="#constring#" providerName="System.Data.SqlClient" />
8 //就是替换#constring#为安装过程中生成的新的链接字符串。

自然建站不唯有只有这么些,还会有新建应用程序池,咱们能够去找找质感进行补缺

设置就到那时候了,现在来探视卸载。

 

卸载:

率先右键安装项目》自定义操作》右键卸载》增加自定义操作》应用程序文件夹

图片 38

采用主输出来自unLibrary1(活动)

图片 39

然而大家这边并无需设置CustomActionData值,直接写代码

因为相似卸载的时候都不会去设置什么样数据

在演示中的做法在装置的时候是绝非难题的,在卸载也许修复的时候,就可以一时常了,卸载的时候大家要求删除数据库文件,那么自身就必要连接数据库了

1 /// <summary>
2         /// 获取数据库登录连接字符串
3         /// </summary>
4         /// <param name="databasename">数据库名称</param>
5         /// <returns></returns>
6         private string GetConnectionString(string databasename)
7         {
8             return "server="   Context.Parameters["server"].ToString()   ";database="   (string.IsNullOrEmpty(databasename) ? "master" : databasename)   ";User ID="   Context.Parameters["user"].ToString()   ";Password="   Context.Parameters["pwd"].ToString();
9         }

此处是无力回天获取科学的链接字符串,Context.Parameters["server"] 这一个都曾经不设有了,所以要想在卸载和修补的时候都能够用,则必要在装置的时候保存连接字符串。

封存的任务和格局可依附本身的喜好存储,终究总是字符串不是秘密,示例中我们是保存在App_Date中的

1 string connectionString = GetConnectionString(null);
2                 //保存数据连接词,为卸载做准备
3                 File.WriteAllText(Path.Combine(targetdir   "App_Data\", "log.txt"), connectionString);

当然大家也得以在装置保存的时候对三番五次字符串举行加密,在卸载中打开解密。

 1 //判断文件是不是存在
 2                     string webconfigpath = "";
 3                     if (File.Exists(s   "App_Data\log.txt"))
 4                     {
      //读取文件中的连接字符串
 5                         webconfigpath = Path.Combine(s   "App_Data\", "log.txt");
 6                         
 7                         string connectionString = File.ReadAllText(webconfigpath);
 8                         try
 9                         {
10                             using (SqlConnection connection = new SqlConnection(connectionString))
11                             {
12                                 connection.Open();
13                                 string sql = " if exists(select * from sysdatabases where name='jiaowuDB' )begin alter database jiaowuDB set single_user with rollback immediate   drop database jiaowuDB  end ";
14                                 ExecuteSQL(connection, sql);
15                                 connection.Close();
16                             }
17                             File.Delete(s   "App_Data\log.txt");
18                         }
19                         catch (Exception es)
20                         {
21                             MessageBox.Show("删除数据失败,请手动删除!n"   es.Message, "出错啦!");
22                         }
23                     }

unLibrary1类代码:

图片 40图片 41

  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.ComponentModel;
  5 using System.Configuration.Install;
  6 using System.Linq;
  7 using System.Management;
  8 using System.Data.SqlClient;
  9 using System.IO;
 10 using System.DirectoryServices;
 11 using System.Windows.Forms;
 12 
 13 
 14 namespace unLibrary1
 15 {
 16     [RunInstaller(true)]
 17     public partial class unInstaller1 : System.Configuration.Install.Installer
 18     {
 19         public unInstaller1()
 20         {
 21             InitializeComponent();
 22         }
 23 
 24         private string _target;
 25         private DirectoryEntry _iisServer;
 26         private ManagementScope _scope;
 27         private ConnectionOptions _connection;
 28         /// <summary>
 29         /// 卸载 
 30         /// </summary>
 31         /// <param name="savedState"></param>
 32         public override void Uninstall(IDictionary savedState)
 33         {
 34             base.Uninstall(savedState);
 35             //System.Diagnostics.Debugger.Launch();   //调试代码
 36             string serID = "66";
 37             try
 38             {
 39                 Connect();
 40                 string SiteID = IsWebSiteExists(serID);
 41                 if (SiteID == "") { return; }
 42                 else
 43                 {
 44                     //这里要获取保存的链接字符串
 45                     DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC");//参数只能这样写  
 46                     DirectoryEntry site = (DirectoryEntry)root.Invoke("GetObject", "IIsWebServer", serID);//serID:为站点ID 
 47                     DirectoryEntry siteVDir = site.Children.Find("Root", "IISWebVirtualDir");//参数只能这样写  
 48                     string s = siteVDir.Properties["Path"].Value.ToString();     //安装地址
 49                     //判断文件是不是存在
 50                     string webconfigpath = "";
 51                     if (File.Exists(s   "App_Data\log.txt"))
 52                     {
 53                         webconfigpath = Path.Combine(s   "App_Data\", "log.txt");
 54                         
 55                         string connectionString = File.ReadAllText(webconfigpath);
 56                         try
 57                         {
 58                             using (SqlConnection connection = new SqlConnection(connectionString))
 59                             {
 60                                 connection.Open();
 61                                 string sql = " if exists(select * from sysdatabases where name='jiaowuDB' )begin alter database jiaowuDB set single_user with rollback immediate   drop database jiaowuDB  end ";
 62                                 ExecuteSQL(connection, sql);
 63                                 connection.Close();
 64                             }
 65                             File.Delete(s   "App_Data\log.txt");
 66                         }
 67                         catch (Exception es)
 68                         {
 69                             MessageBox.Show("删除数据失败,请手动删除!n"   es.Message, "出错啦!");
 70                         }
 71                     }
 72                     DelSite(serID);
 73                 }
 74             }
 75             catch (Exception ex)
 76             {
 77                 MessageBox.Show("卸载出错!n"   ex.Message, "出错啦!");
 78             }
 79 
 80         }
 81 
 82         #region Connect 连接IIS服务器
 83         public bool Connect()
 84         {
 85             try
 86             {
 87                 _iisServer = new DirectoryEntry("IIS://localhost/W3SVC/1");
 88                 _target = "localhost";
 89                 _connection = new ConnectionOptions();
 90                 _scope = new ManagementScope(@"//localhost/root/MicrosoftIISV2", _connection);
 91                 _scope.Connect();
 92             }
 93             catch
 94             {
 95 
 96                 return false;
 97             }
 98             return IsConnected();
 99         }
100         public bool IsConnected()
101         {
102             if (_target == null || _connection == null || _scope == null) return false;
103             return _scope.IsConnected;
104         }
105         #endregion
106 
107 
108         /// <summary>
109         /// 删除站点
110         /// </summary>
111         /// <param name="WebSiteName">站点ID</param>
112         public void DelSite(string WebSiteID)
113         {
114             try
115             {
116                 string SiteID = IsWebSiteExists(WebSiteID);
117                 if (SiteID == "") return;
118 
119                 DirectoryEntry deRoot = new DirectoryEntry("IIS://localhost/W3SVC");
120                 try
121                 {
122                     DirectoryEntry deVDir = new DirectoryEntry();
123                     deRoot.RefreshCache();
124                     deVDir = deRoot.Children.Find(SiteID, "IIsWebServer");
125                     deRoot.Children.Remove(deVDir);
126                     deRoot.CommitChanges();
127                     deRoot.Close();
128                     return;
129                 }
130                 catch (System.Exception)
131                 {
132                     return;
133                 }
134             }
135             catch (Exception e)
136             {
137                 MessageBox.Show("error:删除站点失败."   e.Message);
138             }
139         }
140 
141         #region IsWebSiteExists 判断网站是否已经存在
142         public string IsWebSiteExists(string serverID)
143         {
144             try
145             {
146                 string siteName = "W3SVC/"   serverID;
147                 ManagementObjectSearcher searcher = new ManagementObjectSearcher(_scope, new ObjectQuery("SELECT * FROM IIsWebServer"), null);
148 
149                 ManagementObjectCollection webSites = searcher.Get();
150                 foreach (ManagementObject webSite in webSites)
151                 {
152                     if ((string)webSite.Properties["Name"].Value == siteName)
153                         return serverID;
154                 }
155 
156                 return "";
157             }
158             catch
159             {
160                 return "";
161             }
162         }
163         #endregion
164 
165 
166         /// <summary>
167         /// 执行sql语句
168         /// </summary>
169         /// <param name="connection"></param>
170         /// <param name="sql"></param>
171         void ExecuteSQL(SqlConnection connection, string sql)
172         {
173             SqlCommand cmd = new SqlCommand(sql, connection);
174             cmd.ExecuteNonQuery();
175         }
176 
177     }
178 }

unLibrary1

 

末段右键安装项目》生成

转变安装包

图片 42

 安装流程预览:

图片 43

图片 44

图片 45

图片 46

图片 47

图片 48

 

 注:

大家一时间能够会有点特殊要求,譬如密文

此地大家就须求用到 数据库表编辑器(orca)了

orca下载地址:

行使orca展开刚生成的Setup.msi文件

挑选control,找到你要编写制定的文本框,将Attributes改成2097159 ,保存

此地我们是CustomTextA中Edit3

图片 49

 

第三次发文,好些个难认为继,请多指教。

本文由亚洲必赢娱乐游戏发布于亚洲必赢网站登录,转载请注明出处:Web项目构建安装包,程序安装打包

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。