本文转自:http://www.cnblogs.com/moonspell/archive/2007/07/27/832433.html
原文如下:
-----------
  一次难得的安装包制作经历,因为之前从没有制作过安装包,那就免不了遇到问题,在摸索和学习中获得了不少宝贵经验,在这里我将用图文并茂的形式详细描述一下流程及主要难点问题的解决方法,希望对需要的朋友有所帮助.

首先建一个Web应用程序的安装项目

建好项目后在该安装项目的文件系统中加入Web应用程序的所有文件,全选后拖到"Web应用程序文件夹"内即可,也可以在"Web应用程序文件夹"点击右键在菜单中选择添加文件

如果有多个Web应用程序需要放在同一个安装包内安装,可以在"目标计算机上的文件系统"上点右键添加"Web自定义文件夹",如图中的WebControls

在Web文件夹的属性里,可以设置一下默认页及虚拟目录名称,其他的属性可以无视,使用默认值就可以了

到此,一个Web应用程序的安装包就基本完成了,直接生成的安装程序就可以将安装到\Inetpub\wwwroot目录下成为一个虚拟站点了,如果你的站点没有数据库的话,基本可以打完收工了^_^

之后遇到的第一个问题就是如何安装数据库.在网上找了一些资料,虽然说的比较详细,但都没有图例,习惯了傻瓜教程的我花了不少时间去摸索,下面就图文说明一下

先设计用户录入SQL数据库信息的界面,这个VS.NET有现成的界面,稍微修改一下即可,非常简单,打开安装包项目的用户界面

在"启动"项里添加一个"文本框(A)"对话框

将"文本框(A)"移动到安装流程中合适的位置,设置一下属性,请注意,这里的EditProperty的值是传递用户输入数据的关键字,必填

下面就进入重点了,这个流程的操作搞了半天才搞明白,在解决方案中再建一个类库项目,名字叫DBInstall,在该项目创建一个继承于System.Configuration.Install.Installer的类


      暂时不写代码,将此类库与安装项目关联起来先,在"Web应用程序文件夹"下的任意文件夹里点击右键添加一个"项目输出"

      默认会选中当前的DBInstall项目,不用改任何选项直接点确定,会在文件夹中新增一个"主输出来自DBInstall(活动)"的文件项

      接下来在项目自定义操作的"安装"项上点右键添加自定义操作,选择刚刚新增"主输出来自DBInstall(活动)"的文件夹,选中确定添加到安装项内

      添加完毕后设置"主输出来自DBInstall(活动)"的 CustomActionData属性的值为 /dbname=[CUSTOMTEXTA1] /server=[CUSTOMTEXTA2] /user=[CUSTOMTEXTA3] /pwd=[CUSTOMTEXTA4] /targetdir="[TARGETDIR]\" ,通过该格式化字符串接收用户输入传递给安装程序的自定义数据,前4个传入值是"文本框(A)"中相关联的TextBox的值,第5个参数 "TARGETDIR"返回的是Web应用程序安装路径

      现在,可以去写安装Sql数据库的代码,在继承于System.Configuration.Install.Installer的InstallDb类中重载Install方法,在该方法内编写安装过程中需要执行的代码

先编写个执行SQL语句的方法,后面编写安装数据库的代码时需要用到,传入的参数分别是 connStr - 数据库链接字符串,DatabaseName - 链接的数据库名称,Sql - 待执行的SQL语句

 1 private void ExecuteSql(string connStr, string DatabaseName, string Sql) {
 2             SqlConnection conn = new SqlConnection(connStr);
 3             SqlCommand cmd = new SqlCommand(Sql, conn);
 4 
 5             conn.Open();
 6             conn.ChangeDatabase(DatabaseName);
 7             try {
 8                 cmd.ExecuteNonQuery();
 9             }
10             finally {
11                 conn.Close();
12             }
13         }

      在研究过程中,我尝试了3种安装数据库的方法,下面将一一讲解一下

第一种方法是通过附加数据库的方式来实现安装数据库,首先将需要安装的初始化数据库从Sql Server中分离,将该数据库的mdf和ldf文件添加到"Web应用程序文件夹"中,这里是放在DataBase文件夹中的,在Install方法中添加以下代码

1 string connStr = string.Format("data source={0};user id={1};password={2};persist security info=false;packet size=4096", this.Context.Parameters["server"], this.Context.Parameters["user"], this.Context.Parameters["pwd"]);
2 string strSql = "EXEC sp_attach_db  @dbname  =  N'" + this.Context.Parameters["dbname"] + "',"
3                                 + "@filename1  =  N'" + this.Context.Parameters["targetdir"] + "DataBase\\DemoData.mdf',"
4                                 + "@filename2  =  N'" + this.Context.Parameters["targetdir"] + "DataBase\\DemoData_log.ldf'";
5 ExecuteSql(connStr, "master", strSql); 

      可以看到,通过this.Context.Parameters ["KeyName"]的方法,可以获取由应用程序传递的自定义数据,获取数据库的相关信息拼成链接字符串,再拼一个附加数据库的SQL语句,用的是 master库中的存储过程sp_attach_db,3个参数分别是数据库的名称,及mdf和ldf完整路径,因此要拼完整具体目录并加上文件名,这 样,执行一下这个Sql语句即能将数据库附加到Sql Server,但是这样做有个问题,卸载安装时安装程序会删除mdf和ldf文件,如果数据库在使用中,则卸载出错,如果数据库未使用,则被删除,后果严 重,因此,只能用脚本去安装数据库

第二种方法是从网上看来的,在进程中通过osql.exe去执行SQL脚本文件安装数据库

1 System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();
2 sqlProcess.StartInfo.FileName = "osql.exe";
3 sqlProcess.StartInfo.Arguments = string.Format(" -U {0} -P {1} -d {2} -i {3}/db.sql", this.Context.Parameters["user"], this.Context.Parameters["pwd"], this.Context.Parameters["dbname"], this.Context.Parameters["targetdir"]);
4 sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
5 sqlProcess.Start();
6 sqlProcess.WaitForExit(); //等待执行

      此种方法需要开一个进程,性能比较高,并且将进程的WindowStyle 设置为Hidden,用户就看不到执行时的Dos窗体了,最后,一定要加上等待执行完成的WaitForExit方法,否则,数据库还未安装完成时安装程 序很可能就已经完成安装提示用户可以退出了

第三种方法是直接用先前所写的ExecuteSql方法执行安装脚本中的Sql语句

1 string connStr = string.Format("data source={0};user id={1};password={2};persist security info=false;packet size=4096", this.Context.Parameters["server"], this.Context.Parameters["user"], this.Context.Parameters["pwd"]);
2 ExecuteSql(connStr, "master", "CREATE DATABASE " + this.Context.Parameters["dbname"]);

4 StringBuilder sb = this.GetSqlFile("Demo.sql");
5 ExecuteSql(connStr, this.Context.Parameters["dbname"], sb.ToString());

7 sb = this.GetSqlFile("Demo_Data.sql");
8 ExecuteSql(connStr, this.Context.Parameters["dbname"], sb.ToString());

      通过GetSqlFile方法获得脚本中的Sql,这里用了两个脚本文件,一个是创建数据库的,一个是创建默认数据的,两个脚本文件是可以合并成一个文件的,执行一次即可
1 // 获取Sql文件里的脚本
2 private StringBuilder GetSqlFile(string pFileName) {
3             StringBuilder sqlTemp = new StringBuilder();

5             sqlTemp.Append(File.ReadAllText(this.Context.Parameters["targetdir"] + "DataBase\\" + pFileName, System.Text.Encoding.GetEncoding("GB2312")));

7             return sqlTemp;
8 }

      需要提醒的是,创建数据库的脚本文件中,需要将"GO","SET ANSI_NULLS ON","SET QUOTED_IDENTIFIER ON"去掉,否则通过SqlCommand执行会出错,另外,如果默认数据的Insert脚本中包含中文,读取Sql语句时要加上 System.Text.Encoding.GetEncoding("GB2312")这个参数,否则中文变乱码,默认数据的Insert脚本可以在网上找到导出所有数据Insert语句的存储过程

3种安装数据库的方法中后两种比较实用,第一种方法虽然方便快捷,但是卸载时万一将数据库也误卸载,那就损失惨重了

接下来说两个小问题,安装好了肯定要配置Web.Config中的数据库链接字符串,网上有现成的修改App.Config和 Web.Config的方法,和安装数据库时的方法一样,拼好数据库链接字符串,调用修改Web.Config的方法,通过键名找到相应的键,将键值改为 新的数据库链接字符串即可

另一个问题是在不同系统环境下测试安装包时发现的,如果系统中有.NET 1.1和.NET 2.0两个环境,安装的虚拟站点默认使用1.1的.NET版本,如果系统先安装了.NET 2.0再安装IIS,那默认网站的ASP.NET版本选项是空的,没有选中2.0版本,因此安装的虚拟目录ASP.NET版本选项也是空的,问了不少网 友,都说需要执行aspnet_regiis.exe -i去注册2.0版本的.NET,但是如果安装好了再让用户去做这些操作总觉得有些别扭,看了一下aspnet_regiis.exe的参数说明,发现可 以对某个虚拟站点进行.NET版本注册,就写下面这段代码去注册当天安装的虚拟目录

1 string path = Environment.GetFolderPath(Environment.SpecialFolder.System).ToUpper().Replace("SYSTEM32", "") + @"Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe";

3 System.Diagnostics.Process process = new System.Diagnostics.Process();
4 process.StartInfo.FileName = path;
5 process.StartInfo.Arguments = "-s W3SVC/1/ROOT/" + "虚拟站点名称";
6 process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
7 process.Start();
8 process.WaitForExit();

      第一行的代码是获取aspnet_regiis.exe的具体路径,然后通过一个进程去执行注册操作,这样,即使出现前两种情况,都不用担心没有将虚拟站点的ASP.NET版本注册正确Web应用程序无法运行了

这两部分代码可以建一个像安装数据库一样继承于System.Configuration.Install.Installer的自定义操作来执行,不过,方便起见,直接放在InstallDB类中就可以了

安装包的制作是件很复杂的事,通过这次经历,只是学到了一点皮毛,在这里班门弄斧一下,希望对需要的朋友有所帮助^_^

转载于:https://www.cnblogs.com/hzuIT/articles/1139403.html

[转]一次.NET Web应用程序安装包的制作经历:Sql数据库安装的3种方式 配置IIS及Web.Config文件...相关推荐

  1. 发布文件打包springboit_程序安装包咋制作的?Qt程序打包三部曲,从应用程序到安装包...

    前言 本章节主要是讲解下如何打包Qt程序.Qt使用自带的windeployqt 处理依赖库生成exe来发布软件. 准备exe 1.程序要想发布,在编译器编译一定要选择"release&quo ...

  2. C#软件winform程序安装包制作

    转自:http://jingyan.baidu.com/article/b2c186c8e26f2ac46ef6ff3a.html 使用vs2010 winform程序开发的软件的人比较多,程序的开发 ...

  3. C#软件winform程序安装包制作及卸载程序制作

    使用vs2010 winform程序开发的软件的人比较多,程序的开发是为了在不同的人不同的机器使用,为了使不同的机器能使用该软件就需要在制作程序安装包,安装包里必须包含该软件运行所选的所有环境,下面就 ...

  4. 程序安装包制作工具 v1.0官方版

    2019独角兽企业重金招聘Python工程师标准>>> 名称:程序安装包制作工具 v1.0官方版 版本:1.0更新日期:2016-06-27 大小:2.9MB软件语言:简体中文 软件 ...

  5. linux程序安装包怎么用,制作Linux下程序安装包——使用脚本打包bin、run等安装包...

    制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了.一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可. ...

  6. yum 安装程序找不程序安装包,诸如类似 No package zlib-devel available 报错的解决

    yum 安装程序找不程序安装包,诸如类似 No package zlib-devel available 报错的解决 一.问题现象 在root权限下安装zlib-devel包, # yum insta ...

  7. 程序的安装——软件安装包的制作、软件仓库的使用

    读书笔记 -- <嵌入式C语言自我修养> 软件安装 linux 安装包的制作 编译 软件安装包路径 使用dpkg命令来制作安装包   及   安装包的卸载 软件仓库 更新源 查看具体需要更 ...

  8. 用inno Setup做应用程序安装包的示例脚本 .iss文件

    用innoSetup做应用程序安装包的示例脚本(.iss文件),具体要看innoSetup附带的文档,好象是pascal语言写的脚本. 示例1(应用程序.exe,客户端安装): ;{089D6802- ...

  9. 用inno Setup做应用程序安装包的示例脚本(.iss文件)(

    用innoSetup做应用程序安装包的示例脚本(.iss文件),具体要看innoSetup附带的文档,好象是pascal语言写的脚本. 示例1(应用程序.exe,客户端安装): ;{089D6802- ...

最新文章

  1. 希尔排序的java算法_Java算法系列篇 【希尔排序】
  2. java 查看文件属性_java File类获取文件属性详解
  3. 去除a链接+java正则_JavaScript实现正则去除a标签并保留内容的方法【测试可用】...
  4. 殷拓联手红星美凯龙收购软装家具企业“墙尚”40%股份​
  5. Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock
  6. python面向对象(2)—— 继承(2)
  7. Intellij IDEA2017 的控制台里不识别maven命令问题处理
  8. ServletContext作用功能详解
  9. I2C总线协议详解(特点、通信过程、典型I2C时序)
  10. eXtremeComponents使用总结--1(转载)
  11. 3DMax如何安装?3DMax2018软件安装图文教程全解
  12. 在使用QueryRunner时候的异常问题Wrong number of parameters:excepted 0,was given 10 Query
  13. 运行Shell脚本的两种方法
  14. win7 64位官方旗舰版上搭建ruby on rails的步骤
  15. 论文阅读:Automatic Landmark Estimation for Adolescent Idiopathic Scoliosis Assessment Using BoostNet
  16. 安利几款win10小工具
  17. 终于学完了阿里P8架构师7年心血整理总结的微服务实战文档
  18. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java大学生学科竞赛管理系统7jdqe
  19. AVM环视系统算法框架
  20. python中dumps是什么意思_python中的dumps和loads区别

热门文章

  1. mvn打包的POm文件
  2. 线性回归——最小二乘法_实例(二)
  3. 理解VMware虚拟网络
  4. 学习动态性能表(3)--v$sqlv$sql_plan
  5. 技术随笔 查找速度最快的Google IP
  6. 两台路由器之间建立邻接关系的过程即报文信息交换过程
  7. 《LeetCode力扣练习》剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java
  8. linux 中samba账号登录密码,ubuntu下的Samba配置:使每个用户可以用自己的用户名和密码登录自己的home目录...
  9. linux批量umount脚本,Linux下批量ping某个网段ip的脚本
  10. php mysql可以跨站_PHP防跨站之open_basedir目录设置