重要更新:鉴于很多小伙伴们说看不到图,我这边换了几个浏览器看了下,都看得到的,估计是网速问题,请耐心等待,另外,为了更好的方便大家学习,特此提供源码以及一个word文档,word文档就是本文内容,包括图片,下载链接在最底下,谢谢.
  前言:最近公司有个Web要发布,但是以前都是由实施到甲方去发布,配置,这几天有点闲,同事让我搞一个一键发布,就和安装软件那样的程序,好让实施直接配置一下数据库就可以了,然后到网上搜了下,找到一些相关的教程,现在整理了一下,花了一个下午的时间来写笔记,写好了,首先奉献给博客园的小伙伴们,和大伙儿分享一下,好了,下面进入主题~~~
1,首先打开VS2010,新建一个项目,如图1-1所示:
 
图1-1
2,然后再按照图2-1所示操作,添加现有项目,现有项目就是您要发布的Web的项目,这里只需要添加Web的那一个项目即可,类库那些可以不用添加;
 
图2-1
3,添加完之后,如图3-1所示
 
图3-1
4,接着按照图4-1所示操作,添加项目输出:
 
图4-1
5,如图5-1所示,添加相应的项目输出,项目选中您要发布的项目,我这里是Web,然后里面选中:"本地化资源"和"内容文件",然后确定添加.
 
图5-1
6,接下来,我们转到用户界面,如图6-1所示:
 
图6-1
7,在启动那里右键→添加对话框,如图7-1所示:
 
图7-1
8,这次,我们依次添加许可协议(图8-1),文本框(A)(图8-2),有需要的情况,可以再添加一个客户信息,这个看个人所需,这里就不再一一演示了.
 
图8-1
 
图8-2
9,然后我们先右键,把位置整理好来,如图9-1所示:
 
图9-1
10,现在我们来说说许可协议的方面,现在先新建一个word文档,然后在word文档里面写上一些字,这里就简单写了以下几个字:"

这个是一个许可协议,同意请按”下一步”,不同意请按”取消”.";

然后另存为:如图10-1所示:

图10-1

然后选择格式为rtf的文件保存起来,如图10-2所示:

图10-2

11,现在回到我们的程序里面,我们右键许可协议,选择属性,然后看到属性框这里,把刚刚我们编辑好的rtf文件弄进来,具体操作如图11-1,11-2,11-3所示:

图11-1

图11-2

图11-3,

单击"添加文件",然后选中刚刚您编辑好的rtf文件,确定即可,如图11-4所示:

图11-4;

12,现在我们来看看文本框的作用,首先给大家科普一下这个文本框的作用.大家在安装软件或者配置网站的时候,往往都会做一些数据库配置的东西,因为不同的电脑,他的sql服务器名就不一样,有些有了实例名,那就不能都默认为localhost了,还有用户名,密码什么的,每台机器都不一样,所以,这里我们就要用到文本框来帮我们录入这些将要安装部署我们网站的一些信息了.ok,下面,我们就来操作这个文本框了,如图12-1所示,把该输进去的输好来,建议新手先按照我截图的来输,到后面自己熟练了再做修改,

图12-1

13,完成12的操作的时候,接下来,我们回到上面,添加一个新建项目,如图13-1所示:

图13-1

然后我们添加一个安装类,如图13-2所示:

图13-2

接下来,我们在新建好的类库里面,右键再添加一个新建项,如图13-3,所示:

图13-3

接下来,我们选择新建项为一个"安装程序类",如果找不到,可以在右上角的搜索框哪里输入"安装",搜索出来的结果第一个就是了,如图13-4所示:

图13-4

添加完了以后,我们就切换到代码模式,看看这个类有啥东东,来,一起gogogo,如图13-5所示:

图13-5

我们发现,他的代码很简洁,如图13-6所示:

图13-6

14,好嘞,做完这一步我们返回解决方案这边来,右键项目,添加项目输出,如图14-1所示:

图14-1

然后:项目选择---安装类,然后内容选择主输出,确定就好,如图14-2所示:

图14-2

15,接下来,我们就转到自定义操作这边来,如图15-1所示:

图15-1

然后右键添加自定义操作,如图15-2所示:

图15-2

然后双击进入"应用程序文件夹",如图15-3所示:

图15-3

然后选中"主输出来自安装类(活动)",点击确定即可,如图15-4所示:

图15-4

16,然后在去到这个的属性,如图所示,输入以下内容到相应位置,内容为(红色字体,黑色的双引号不要,但是红色的双引号要):"/dbname=[DBNAME] /server=[SERVER] /user=[UNAME] /pwd=[PWD] /targetdir="[TARGETDIR]\"",如图16-1所示:

图16-1

这里面就解释以下,刚刚各位应该还有印象我们之前添加了一个文本框吧?还记得文本框的内容么?嘿嘿,来,咱给你回忆一下,如图16-2所示:

图16-2

哈哈,想起来了吧,对了,这里面就是把文本框的值弄过来滴...等下再告诉你怎么用.好的,昨晚这一步了,我们要回到"安装类"里面来写一写代码了.(什么!!!这都还要写代码?!楼主,你这是要闹哪样~~~楼主回复:小盆友,代码不多滴,放心吧,呵呵)

17,现在我们回到安装类库下面的Installer1.cs,不会进入的就双击那个文件,然后点击切换到后台代码即可,先把代码补全,再慢慢给大伙解释哈,如图17-1所示;

图17-1

详细代码:

        /// <summary>
        /// 重写安装方法
        /// </summary>
        /// <param name="stateSaver"></param>
        public override void Install(IDictionary stateSaver)
        {
            base.Install(stateSaver);
            string Server = Context.Parameters["server"].ToString();
            string dbName = Context.Parameters["dbname"].ToString();
            string userName = Context.Parameters["user"].ToString();
            string userPass = Context.Parameters["pwd"].ToString();
            string targetdir = Context.Parameters["targetdir"].ToString();
            
            /*
            * 设置webconfig连接字符串
            */
            string webconfigpath = Path.Combine(this.Context.Parameters["targetdir"].ToString(), "web.config");
            //修改第一个数据库连接
            string webcofnigstring2 = File.ReadAllText(webconfigpath).Replace(@"server=JEFFREY9061\SQL2008;database=yd_esms;uid=sa;pwd=********", GetConnectionString2());
            File.WriteAllText(webconfigpath, webcofnigstring2);
            //修改第二个数据连接
            string webcofnigstring = File.ReadAllText(webconfigpath).Replace(@"Data Source=JEFFREY9061\SQL2008;Initial Catalog=yd_esms;Persist Security Info=True;User ID=sa;Password=******", GetConnectionString());
            File.WriteAllText(webconfigpath, webcofnigstring);
            //这个是测试在安装目录下添加接收到的用户填写的数据库信息
            File.WriteAllText(Path.Combine(targetdir, "log.txt"), Server + "/n/r" + dbName + "/n/r" + userName + "/n/r" + userPass);
        }
        /// <summary>
        /// 执行sql语句
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="sql"></param>
        void ExecuteSQL(SqlConnection connection, string sql)
        {
            SqlCommand cmd = new SqlCommand(sql, connection);
            cmd.ExecuteNonQuery();
        }
        /// <summary>
        /// 获取文本框输入的信息,来插入到登录连接字符串
        /// </summary>        
        /// <returns></returns>
        private string GetConnectionString()
        {
            return @"Data Source=" + this.Context.Parameters["server"] + ";Initial Catalog=" + this.Context.Parameters["dbname"] + ";Persist Security Info=True;User ID=" + this.Context.Parameters["user"] + ";Password=" + this.Context.Parameters["pwd"] + "";
        }
        private string GetConnectionString2()
        {
            return @"server=" + this.Context.Parameters["server"] + ";database=" + this.Context.Parameters["dbname"] + ";uid=" + this.Context.Parameters["user"] + ";pwd=" + this.Context.Parameters["pwd"];
        }
        ok,现在我们来说说这个代码的意思:

第一个,方法,重写安装方法这个就一般都看得懂了,前面几个string都是获取文本框的值的,下面的就是获去web.config文件,然后修改里面的数据库连接字符串的,因为我用到两个连接字符串,所以写了两个,如果只有一个的,那就写一个即可,这个各取所需哈.

18,(奶奶的,还有?那么长,老子不看了...)其实我想告诉你,结束啦,现在,我们只需要把项目从头到尾(从上到下,先web,然后再安装类,然后再"一键安装抄表系统")生成一边即可,生成完成后,我们就可以在项目右键安装即可.如图18-1所示:(什么!!!没有足够的权限不能运行?老兄,你可以右键,然后在windows打开文件夹,右键以管理员模式运行即可,小儿科啦,相信你懂的.,如图18-2所示)

图18-1

图18-2

19:(怎么还有~~~,我的小宇宙要爆发啦...)小盆友们,别急,我下面给大家贴一贴图,看看安装过程而已,稍安勿躁哈...如图19-1到19-8所示:

 

图19-1

图19-2

图19-3(嘿嘿,这里就是刚刚的许可协议咯)

图19-4(这里就是刚刚我们添加的文本框啦,知道用处了吧)

图19-5(这里面选择好你的应用程序池哟.)

ps:此程序默认的安装路径是:C:\inetpub\wwwroot,然后访问的时候是:localhost:/xxx/即可,如图19-6和图19-7

图19-6

图19-7

看到这里,就完啦,如果觉得本文对您有所帮助,请点击右下角的"好文要顶"支持一下,谢谢;

另外如果在安装过程中碰到这个问题:

解决方法如下:

打包时加入卸载功能:

1.在打包项目中添加文件msiexec.exe(一般可在c:\windows\system32\下找到)
2.在文件系统视图中选择应用程序活页夹,在msiexec.exe上按右键,选择创建快捷方式,重命名快捷方式为”卸载”.
3.更改此快捷方式的Arguments 为”/x {产品id}”,产品id的值为打包项目的ProductCode属性值.

web程序打包详解的更多相关文章

  1. VS2010开发程序打包详解

    VS2010开发程序打包详解 转自:http://blog.sina.com.cn/s/blog_473b385101019ufr.html 首先打开已经完成的工程,如图: 下面开始制作安装程序包. ...

  2. Java web.xml 配置详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  3. [深入学习Web安全](5)详解MySQL注射

    [深入学习Web安全](5)详解MySQL注射 0x00 目录 0x00 目录 0x01 MySQL注射的简单介绍 0x02 对于information_schema库的研究 0x03 注射第一步—— ...

  4. java web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  5. web.xml文件详解

      web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...

  6. javaweb web.xml文件详解

    web.xml文件详解 前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程.web.xml主要用来配置Filter.Listener.Servlet等 ...

  7. Asp.net中web.config配置文件详解(一)

    本文摘自Asp.net中web.config配置文件详解 web.config是一个XML文件,用来储存Asp.NET Web应用程序的配置信息,包括数据库连接字符.身份安全验证等,可以出现在Asp. ...

  8. 2-4、nginx特性及基础概念-nginx web服务配置详解

    Nginx Nginx:engine X 调用了libevent:高性能的网络库 epoll():基于事件驱动event的网络库文件 Nginx的特性: 模块化设计.较好扩展性(不支持模块动态装卸载, ...

  9. 使用node-webkit(v0.35.5)和innosetup(3.6.1)打包将web程序打包为桌面客户端(安装包)

    这边主要是有一个客户,需要在电视机上安装一个客户端,含有视频直播功能:刚开始我们采用的webapp打包成apk安装在电视机上,发现摄像头监控画面根本无法播放(apk在手机上可以正常播放视频):排除一些 ...

随机推荐

  1. python脚本linux上后台执行

    1.脚本后加& 加了&以后可以使脚本在后台运行,这样的话你就可以继续工作了.但是有一个问题就是你关闭终端连接后,脚本会停止运行 python3 run.py >/dev/null ...

  2. Wechat微信公众平台开发

    一.微信概述 1.历史背景 1)2011年1月21日,腾讯推出微信应用程序.(张小龙) 2)2012年8月20日,腾讯推出微信公众平台功能,同年11月开放第三方接口 3)2013年11月注册用户量突破 ...

  3. 通过docker-compose构建ghost博客(二)

    上一篇通过yml文件构建 ghost博客,这次通过构建nginx服务,并添加反向代理来运行搭建的ghost博客. 目录结构 ghost.conf 就是 定义的nginx 加载的配置文件 server ...

  4. jqPaginator分页(每次只取一页数据)

    应用技术点:jqPaginator.template7.bootstrap.css 参考网址: jqPaginator:http://jqpaginator.keenwon.com/#a3 templ ...

  5. 如何查看mysql数据库表所使用的引擎(转载)

    我们怎么样才能准确的查看mysql的存储引擎呢,下面我给大家介绍两种正确的方式. 1)正确方式一: SHOW TABLE STATUS from 数据库库名 where Name='表名' 2)mys ...

  6. slam14讲证明构成李代数

  7. 同一个线程多次调用start()会出现的问题

    结果: 线程首先会运行一次,然后抛出java.lang.IllegalThreadStateException异常. 根据控制台的异常信息,定位到Thread.java的第708行,也就start() ...

  8. Zookeeper 修改heap size

    对应原文出处: https://support.pivotal.io/hc/en-us/articles/201861286-Zookeeper-service-heapsize-is-10GB-or ...

  9. BUG(1):一个关于指针的bug

    是时候记录一下这个让我栽了两次的bug了. 具体情况如下: #include <stdio.h>#include <stdlib.h> struct app_info_t { ...

  10. Statement、PreparedStatement、CallableStatement的区别

    此三个接口的声明如下: public interface Statement extends Wrapper, AutoCloseable public interface PreparedState ...