zoukankan      html  css  js  c++  java
  • 使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)

    正文

    前言:上篇使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.config的过程,操作起来是相对比较简单的,只要知道了博主提供的方法,相信都不是问题,其实博主当初寻找相关方法配置IIS和Web.config的时候也是费了九牛二虎之力的,毕竟资料太少,只能各种方式挨个尝试一遍,解决问题之后回过头来看,发现当初也是走了很多的弯路。比如今天要介绍的这个自定义dll的功能。

    关于安装包的制作,可能有人觉得没啥叼用,直接将发布的文件拷贝过去,然后再IIS上面新建站点,配置一下相关的选项就行了呗,哪至于像你说的这么复杂!确实,直接配置没有任何问题,但当你的产品做大了之后,总不能每一次部署都远程到客户的服务器上面操作一番吧,并且很多客户是不愿意让你去登陆他的服务器的,这种情况下直接丢一个exe给别人安装是不是更加方便呢?退一步说,哪怕是为了让我们的系统看上去高大上也行嘛~~

    本文原创地址:http://www.cnblogs.com/landeanfen/p/6369192.html

    一、配置安装包依赖项

    Advanced Installer支持直接在安装包中包含.net Framework,这样在安装软件的时候会检测你的PC上面是否安装了对应的framework的版本,如果没有,则会自动给你安装Framework。并且支持离线和在线两种方式的安装。

    进入到Prerequisites菜单

    选择需要包含的framework的版本,比如博主这里选择4.6.1,支持在线和离线两种方式。如果你选择离线,需要先将framework 4.6.1的安装包下载到本地,然后包含进来;如果是在线安装,则需要提供framework 4.6.1的在线下载地址。比如如果是在线安装,添加成功之后会是这样:

    需要说明的是,如果是离线安装,那我们生成的安装包里面会包含framework的安装包,那么势必会导致安装包过大(比如博主这里包含之后差不多有100M左右);如果是在线安装,必须保证安装环境能够连接互联网。所以,具体选择哪种方式可以根据实际情况来决定。

    除了支持包含framework以外,Advanced Installer还支持允许安装软件检测系统的版本,比如:

    这里勾选的系统版本即为安装必须的系统版本,这个很简单,有兴趣的可以试试。

    除此之外,Advanced Installer还支持安装的时候检测机器上面的浏览器版本、sql  server数据库版本、IIS版本等选项。如果当前安装机器上面的版本低于要求的配置,就会提示错误。

    二、自定义dll(测试数据库连接)

    关于自定义dll这个,博主曾经尝试过很长时间,发现里面有几个坑。且听博主慢慢道来。

    下面博主就以配置Web.config里面的连接字符串为例来说明安装过程中自定义dll的使用。比如,我们拖出如下界面:

    然后四个文本框的属性名分别为EDIT_1_PROP_1、EDIT_2_PROP_1、EDIT_3_PROP_1、EDIT_4_PROP,为了简便,这里就不改这个名称了。然后我们是希望在安装过程中,将用户填写的文本框的值写入到Web.config的Connectionstring里面。然后我们找到自定义操作

    我们新建一个.net操作类,它会提示你使用哪个dll。我们先将预先定义好的一个Mes.Installer.dll添加进来,然后来看这个dll里面的代码。

    首先在VS里面新建一个类库项目Mes.Installer,然后新建一个安装程序类

    继承System.Configuration.Install.Installer类,重写Install()方法。

    在介绍Install()方法的实现之前,还需要说明一下Advanced Installer里面的变量的值如何传到我们的C#程序里面来,上篇我们说过,Advanced Installer里面使用[]来定义变量,那么这个变量如何传入C#程序呢?我们找到Advanced Installer里面有一个Intaller Class Parameters(安装类参数)

    我们新建一个参数,比如:

    [EDIT_1_PROP_1]表示Adavanced Installer里面的文本框的属性,dataSource就对应C#里面参数。我们用同样的方法定义另外几个参数:

    注意,如果要在C#里面读取安装文件的根目录,需要这么定义变量

    有了这个作为基础,我们就可以来看看Install()方法了

    复制代码
         public override void Install(IDictionary stateSaver)
            {
                var path = Context.Parameters["target"].ToString();
                if (!Directory.Exists(path))
                {
                    base.Install(stateSaver);
                    return;
                }
                //1.得到配置文件的物理路径
                var configPath = path + "Web.config";
    
                //2.取参数
                var dataBaseType = Context.Parameters["dataBaseType"].ToString();
                var dataSource = Context.Parameters["dataSource"].ToString();
                var server = Context.Parameters["server"].ToString();
                var userId = Context.Parameters["userId"].ToString();
                var password = Context.Parameters["password"].ToString();
                //var config = WebConfigurationManager.OpenWebConfiguration(configPath);
                //3.写xml
                var config = XDocument.Load(configPath);
                var connectionStrings = config.Element("configuration").Element("connectionStrings");
                string connectionString, providerName;
    
                connectionString = string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", dataSource, server, userId, password);
                providerName = "System.Data.SqlClient";
                
                var adds = connectionStrings.Elements("add");
                foreach (var add in adds)
                {
                    if (add.Attribute("name").Value == "Entities")
                    {
                        add.Attribute("connectionString").Value = connectionString;
                        add.Attribute("providerName").Value = providerName;
                        break;
                    }
                }
                config.Save(configPath);
    
                //4.调用父类的Install()方法
                base.Install(stateSaver);
            }
    复制代码

    注意这里有一个坑:之前按照园子里的一篇文章来操作,将 base.Install(stateSaver); 这一句放在Install()方法的最前面,最后发现安装的时候怎么都执行不了自己写的代码,就为这博主折腾了很久。

    如果你看过博主上篇文章,你可能会疑惑,如果仅仅是配置连接字符串,直接在Advanced Installer里面通过变量的形式配置xml也是一样啊。比如

    这样配置不是更加简单吗?如果你有这样的疑惑,说明你是一个用心的读者,为你点个赞!确实,这样也能解决连接字符串的问题,因为博主的项目里面需要区分sql server数据库和oracle数据库,由于不同的数据库类型在web.config里面的连接字符串的形式不同,所以博主使用了dll的方式来操作。并且,在一些特定的情况下,我们使用dll的方式能够更加方便地和我们的系统打交道,比如我们需要在安装的时候去初始化系统的一些配置,这些时候使用dll的优势就凸显了。

    关于数据库的配置,还有一点是值得一提的,那就是我们的Advanced Installer支持在安装的过程中测试数据库连接。还是在dialog里面Add dialog...,

    确定之后如下

    这样,我们在安装的过程中,组件会自动检测我们系统的sql Server实例,我们输入用户名密码之后,点击“Test Sql Connection”按钮,可以检测是否连接成功。

    以上是针对sql server的,对于oracle数据库的测试链接,就略显复杂,需要配置ODBC相关的选项。暂且不展开说了,看看园友们对这块有没有需求。

     
  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/MuNet/p/6688409.html
Copyright © 2011-2022 走看看