杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2734|回复: 0

使用 Advanced Installer 制作IIS安装包

[复制链接]
发表于 2017-12-25 19:30:25 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、基础用法关于Advanced Installer的基础用法,网上真的是可以搜到太多,博主就不做过多描述,由于要用到自定义安装包的过程,需要新建dialog,博主用了破解版的企业模板,Advanced Installer的版本是13.5。

首先新建模板里面选择Enterprise。
459756-20170131215033792-1295545411.png
需要设置的几个关键点如下:
添加安装包的文件和文件夹
459756-20170131215537058-293644479.png
如果是Web安装包,需要设置IIS的相关信息,这个网上非常多的资料,不做过多说明。
459756-20170131215700683-568150860.png
自定义dialog,注意这里必须要是企业版的模板才有这个功能。
459756-20170131215828339-1923305635.png
459756-20170131215957292-1015789273.png

二、设置IIS网站的网站名、IP、端口号如果仅仅是上述这些东西,本文是没有太大价值的。以上只是铺垫,下面才是本文要说的重点。
可以自定义dialog,动态配置IIS的网站名、绑定IP、端口。
1、新建dialog,拖出安装过程中dialog的外观,相信有winform经验的我们来说,这个再简单不过了。比如下面的效果:
459756-20170131220841308-1802152058.png
记住各个文本框的属性名,比如这里的网站名称对应的文本框的属性名为EDIT_2_PROP_1。
459756-20170131221058417-225106491.png
我们暂且记住这个属性名,来到IIS选项卡里面,我们这么配置:
459756-20170131221334933-335202549.png
原来,在Advanced Installer里面,使用中括号[]将控件的属性名括起来表示变量的概念,这点对于咱们程序员来说应该不难理解。这么说是不是很好理解了呢~~然后,我们用同样的方法设置IIS网站的绑定IP和端口号。
459756-20170131221922120-1183633748.png
459756-20170131221938261-1471837448.png
这样设置之后,我们在安装过程中就可以去动态配置IIS的网站名、IP、端口。就是这么简单,是不是很神奇~~

三、动态配置Web.config在安装过程中,我们最常配置的还有Web.config配置文件,在Advanced Installer里面可以方便的配置xml文件。赶快来看看吧。
首先看看Web.config里面的内容。
459756-20170131223603839-1765365461.png
在添加文件的时候,如果我们添加的文件类型是xml,Advanced Installer会提示你是否转成可配置的xml。比如我们在Web.config文件上面右键,选择Properties。
459756-20170131222920604-1311244509.png
459756-20170131223643261-1465464226.png
再来看看这里的[EDIT_1_PROP]是哪里来的。
459756-20170131223754183-136217979.png
有了上文的基础,这个应该不难理解了吧。没错,就是通过这种变量的形式去动态配置的。这里只是配置了一个简单的appsetting作为示例,可能实际环境中使用最多的就是动态去配置connectionstring了,如果有兴趣可以试试,和以上的步骤基本相似。当然,之前在园子里看到一个通过自定义dll去配置web.config的示例,略显麻烦。还是这样简单。
做了这些准备工作之后,我们的安装包基本就做完了。编译运行之后,经过一步一步傻瓜式的安装之后,即可动态去配置这些东西,不信你试试~~

前言:上篇使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.config的过程,操作起来是相对比较简单的,只要知道了博主提供的方法,相信都不是问题,其实博主当初寻找相关方法配置IIS和Web.config的时候也是费了九牛二虎之力的,毕竟资料太少,只能各种方式挨个尝试一遍,解决问题之后回过头来看,发现当初也是走了很多的弯路。比如今天要介绍的这个自定义dll的功能。
关于安装包的制作,可能有人觉得没啥叼用,直接将发布的文件拷贝过去,然后再IIS上面新建站点,配置一下相关的选项就行了呗,哪至于像你说的这么复杂!确实,直接配置没有任何问题,但当你的产品做大了之后,总不能每一次部署都远程到客户的服务器上面操作一番吧,并且很多客户是不愿意让你去登陆他的服务器的,这种情况下直接丢一个exe给别人安装是不是更加方便呢?退一步说,哪怕是为了让我们的系统看上去高大上也行嘛~~
一、配置安装包依赖项Advanced Installer支持直接在安装包中包含.net Framework,这样在安装软件的时候会检测你的PC上面是否安装了对应的framework的版本,如果没有,则会自动给你安装Framework。并且支持离线和在线两种方式的安装。
进入到Prerequisites菜单
459756-20170206111848619-748767633.png
选择需要包含的framework的版本,比如博主这里选择4.6.1,支持在线和离线两种方式。如果你选择离线,需要先将framework 4.6.1的安装包下载到本地,然后包含进来;如果是在线安装,则需要提供framework 4.6.1的在线下载地址。比如如果是在线安装,添加成功之后会是这样:
459756-20170206112200963-657524580.png
需要说明的是,如果是离线安装,那我们生成的安装包里面会包含framework的安装包,那么势必会导致安装包过大(比如博主这里包含之后差不多有100M左右);如果是在线安装,必须保证安装环境能够连接互联网。所以,具体选择哪种方式可以根据实际情况来决定。
除了支持包含framework以外,Advanced Installer还支持允许安装软件检测系统的版本,比如:
459756-20170206112848072-1267601661.png
这里勾选的系统版本即为安装必须的系统版本,这个很简单,有兴趣的可以试试。
除此之外,Advanced Installer还支持安装的时候检测机器上面的浏览器版本、sql  server数据库版本、IIS版本等选项。如果当前安装机器上面的版本低于要求的配置,就会提示错误。

二、自定义dll(测试数据库连接)关于自定义dll这个,博主曾经尝试过很长时间,发现里面有几个坑。且听博主慢慢道来。
下面博主就以配置Web.config里面的连接字符串为例来说明安装过程中自定义dll的使用。比如,我们拖出如下界面:
459756-20170206135209557-927130063.png
然后四个文本框的属性名分别为EDIT_1_PROP_1、EDIT_2_PROP_1、EDIT_3_PROP_1、EDIT_4_PROP,为了简便,这里就不改这个名称了。然后我们是希望在安装过程中,将用户填写的文本框的值写入到Web.config的Connectionstring里面。然后我们找到自定义操作
459756-20170206135517338-1779870955.png
我们新建一个.net操作类,它会提示你使用哪个dll。我们先将预先定义好的一个Mes.Installer.dll添加进来,然后来看这个dll里面的代码。
首先在VS里面新建一个类库项目Mes.Installer,然后新建一个安装程序类
459756-20170206161509197-1867394032.png
继承System.Configuration.Install.Installer类,重写Install()方法。
在介绍Install()方法的实现之前,还需要说明一下Advanced Installer里面的变量的值如何传到我们的C#程序里面来,上篇我们说过,Advanced Installer里面使用[]来定义变量,那么这个变量如何传入C#程序呢?我们找到Advanced Installer里面有一个Intaller Class Parameters(安装类参数)
459756-20170206162137307-1767429562.png
我们新建一个参数,比如:
459756-20170206162357166-1748555369.png
[EDIT_1_PROP_1]表示Adavanced Installer里面的文本框的属性,dataSource就对应C#里面参数。我们用同样的方法定义另外几个参数:
459756-20170206162635151-40412199.png
注意,如果要在C#里面读取安装文件的根目录,需要这么定义变量
459756-20170206162836776-721593290.png
有了这个作为基础,我们就可以来看看Install()方法了
  1. public override void Install(IDictionary stateSaver)
  2.         {
  3.             var path = Context.Parameters["target"].ToString();
  4.             if (!Directory.Exists(path))
  5.             {
  6.                 base.Install(stateSaver);
  7.                 return;
  8.             }
  9.             //1.得到配置文件的物理路径
  10.             var configPath = path + "Web.config";

  11.             //2.取参数
  12.             var dataBaseType = Context.Parameters["dataBaseType"].ToString();
  13.             var dataSource = Context.Parameters["dataSource"].ToString();
  14.             var server = Context.Parameters["server"].ToString();
  15.             var userId = Context.Parameters["userId"].ToString();
  16.             var password = Context.Parameters["password"].ToString();
  17.             //var config = WebConfigurationManager.OpenWebConfiguration(configPath);
  18.             //3.写xml
  19.             var config = XDocument.Load(configPath);
  20.             var connectionStrings = config.Element("configuration").Element("connectionStrings");
  21.             string connectionString, providerName;

  22.             connectionString = string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", dataSource, server, userId, password);
  23.             providerName = "System.Data.SqlClient";
  24.             
  25.             var adds = connectionStrings.Elements("add");
  26.             foreach (var add in adds)
  27.             {
  28.                 if (add.Attribute("name").Value == "Entities")
  29.                 {
  30.                     add.Attribute("connectionString").Value = connectionString;
  31.                     add.Attribute("providerName").Value = providerName;
  32.                     break;
  33.                 }
  34.             }
  35.             config.Save(configPath);

  36.             //4.调用父类的Install()方法
  37.             base.Install(stateSaver);
  38.         }
复制代码

注意这里有一个坑:之前按照园子里的一篇文章来操作,将 base.Install(stateSaver); 这一句放在Install()方法的最前面,最后发现安装的时候怎么都执行不了自己写的代码,就为这博主折腾了很久。
如果你看过博主上篇文章,你可能会疑惑,如果仅仅是配置连接字符串,直接在Advanced Installer里面通过变量的形式配置xml也是一样啊。比如
459756-20170206164534057-968576533.png
这样配置不是更加简单吗?如果你有这样的疑惑,说明你是一个用心的读者,为你点个赞!确实,这样也能解决连接字符串的问题,因为博主的项目里面需要区分sql server数据库和oracle数据库,由于不同的数据库类型在web.config里面的连接字符串的形式不同,所以博主使用了dll的方式来操作。并且,在一些特定的情况下,我们使用dll的方式能够更加方便地和我们的系统打交道,比如我们需要在安装的时候去初始化系统的一些配置,这些时候使用dll的优势就凸显了。
关于数据库的配置,还有一点是值得一提的,那就是我们的Advanced Installer支持在安装的过程中测试数据库连接。还是在dialog里面Add dialog...,
459756-20170206165712104-1741519633.png
确定之后如下
459756-20170206165724401-205002552.png
这样,我们在安装的过程中,组件会自动检测我们系统的sql Server实例,我们输入用户名密码之后,点击“Test Sql Connection”按钮,可以检测是否连接成功。
459756-20170206165731447-788864770.png
以上是针对sql server的,对于oracle数据库的测试链接,就略显复杂,需要配置ODBC相关的选项。暂且不展开说了,看看园友们对这块有没有需求。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-4-19 22:28 , Processed in 0.418034 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表