2018第一发:记一次【Advanced Installer】打包之旅

一、前言

2017年最后几天,你们都高高兴兴的跨年,博主还在加班制作.net安装包。因为年前要出来第一版的安装包,所以博主是加班加点啊。本来想用VS自带的制作工具,不过用过的人都知道,真是非常好(tong)用(ku),各种包需要单独下载不说,界面也不美观,所以决定弃用之。同事推荐用Advanced Installer,不过同事也是很久不用了,记不起来具体用法。所以博主是边摸索边前进,所以不免跳进坑里,为了避免后来人跳进同样的坑里,作文以记之。

好了,不说废话,正文开始!

二、画流程图

俗话说的好,“磨刀不误砍柴工”!

首先强调一点,我们要先弄清楚我们每一步要做什么,这样接下来在制作安装包时才能条理清晰,有条不紊,不容易犯错。

比如我们要判断客户机器上是否安装.net framework3.5及以上版本,是否安装IIS,是否安装SQL Server2005及以上版本数据库等等。

我这个项目的流程图如下:

Tips1:开始之前最好先画流程图

三、开始制作

有了流程图,只需按部就班!关于Advanced Installer的基础用法,网上有很多的资料,官网也有帮助文档,这里就不赘述了。由于要用到自定义安装包的过程,需要新建对话框,博主用了企业模板,Advanced Installer的版本是14.5.2,也是最新的版本。

1、选择模板

首先新建模板里面选择Enterprise,并选择语言(默认为中文),然后创建项目:

Tips2:如果安装包中需要自定义对话框,则需要选择Enterprise版。

2、设置基本信息

Name即为该安装包的名称,公司就是你所在的公司啦,还有版本信息等等,这个很简单。

3、设置默认安装路径

点击Package Definition->Install Parameters,填写默认安装路径。

Application folder默认的内容是这样:“[ProgramFilesFolder][Manufacturer]\[ProductName]”, 这个内容表示安装时默认的安装路径:

[ProgramFilesFolder]表示文件夹,这里为D:\Program Files(x86)。

[Manufacturer]表示公司名称,这里为Landsoft。

[ProductName]表示产品名称,这里为LandaV9。

4、设置安装条件

点击Requirements->Launch Conditions->Software,勾选相应的条件。这里根据流程图所示,我应该勾选.Net Framework、IIS以及SQL Server。注意这里的条件指的是最低条件,比如我这里SQL Server选的是2005,即客户机器上应该装有2005及以上版本的SQL Server,如果没有装,则会提示没有安装SQL2005。

这里还有系统条件即要求客户机器是win7还是winxp等等。如果还有更多的条件,Custom里面可以自定义。

5、添加文件或文件夹

点击Resources->Files and Folders,在Application Folders上右键,选择Add Folder或者Add Files,这里我添加了5个文件夹,用于后续操作。

6、自定义对话框(Dialog)

新建对话框之前可以在Themes中选择主题和样式。

点击User Interface->Dialogs,在FolderDlg上右键,选择Add Dialog是添加Advanced Installer中自定义的对话框,选择New Dialog是新增一个空的对话框,

然后我们可自行在上面定义内容:

新建对话框后,可以拖出安装过程中dialog的外观,这个对于我们.Net开发人员来说,应该是小Case吧,看一下效果:

可以对文本框设置默认值:

Tips3:文本框中的属性名,不要修改。如果修改会有大问题,至于什么问题,后面再说!

由于我们需要设置连接字符串,所以需要客户设置数据库的相关信息:

选择Add Dialog后,在弹出框中选择SQLServerConnentionDlg

效果如下:

最后再新建一个对话框,用于部署项目到IIS所需要的条件:

同样可以设置网站名称和端口号:根据流程图,这里的默认值需要分别设置为Mango和8001,用户可以自行修改。

到这里新建对话框告一段落。

7、设置必填验证

就拿上面这个对话框为例,虽然我们设置的有默认值,但是客户在安装过程中不小心给删掉了,又没有填写,恰巧又点了下一步,这样的话,安装过程中会有问题。所以我们要做必填验证,即文本框中没有值,则“下一步”按钮不可用,有值才可用。

所以选择“下一步”,关注下方的“Control Conditions”:

点击New按钮在新弹出的界面中在Condition中填写“NOT EDIT_1_DROP OR NOT EDIT_1_DROP_1”,在Action中选择Disable。

EDIT_1_DROP和EDIT_1_DROP_1就是网站名称和端口号,前面加NOT的意思就是,如果这两个文本框中任意一个没有填写,则按钮不可用(Disable)。

同理再添加一个“EDIT_1_DROP AND EDIT_1_DROP_1”,在Action中选择Enable。即都填内容了,则按钮可用。这样就对控件做了必填验证。是不是很简单呢!

8、设置桌面快捷方式

根据流程图所示,安装结束后,需要在桌面生成快捷防方式。所以接下来,我们就来做这件事:

首先来到Files and Folders选项卡,在Application Shortcut Folder上面右键 选择“New Shortcut”,弹出如下界面:

在这个框里主要设置快捷方式的Name和描述以及图标(这个图标,可以选择.exe文件)。点击OK,就会在Application Shortcut Folder中显示这样一条信息。

但是先别急,如果仅仅是这样的话,快捷方式是不起作用的。因为我们还没有设置快捷方式对应的可执行文件。

双击这条信息,在弹出的对话框中设置Shortcut Target。

看到这,肯定有人有疑问?既然这样为什么不在新增快捷方式的时候一起设置呢?

因为在新增的时候,Shortcut target这个文本框中的内容不能修改。这个很坑爹,博主也试了好久才试出来的。

最后,将这个信息拖到Desktop里面即可,安装完毕后,就会在桌面显示这个快捷方式。

四、设置IIS网站的网站名、端口号

在上面对话框的最后一步中,我们记住网站名称的和端口号的文本框的属性名,然后来到IIS选项卡中:

首先新增一个应用程序池,名称即为网站名称文本框的属性名,这里为EDIT_1_PROP,在Advanced Installer里面,使用中括号[]将控件的属性名括起来表示变量的概念。

在Basic Pool Settings中设置程序池的启动模式为总是启动,勾选立即启动程序池复选框,framework版本选择为4.0,托管模式选择为集成。

在Identity中设置应用程序池表示为ApplicationPoolIdentity。

应用程序池设置好之后,再来设置站点:

新建一个站点名称同样为EDIT_1_PROP,在Basic Site Setting中设置Name和文件路径。

在Bindings/SSL中设置端口号,IP地址选择全部未分配。

在Application Pool中选择刚刚新建的应用程序池。

到这里IIS这一块就设置好了。

安装过程中,Advanced Installer就会自动的将网站部署好。这个真的是很牛很强大!不得不佩服人家做的就是好!

五、两种方式设置config文件

1、直接在Advanced Installer中设置

在添加文件的时候,如果有xml类型的文件,会有这样的提示:

这时候我们勾选需要修改配置的文件,点击ok,这样就可以直接在Advanced Installer中修改。

找到需要修改的节点,直接有文本框的属性替换掉就可以:

这样,在安装过程中就会将config文件中的相应的节点替换为客户输入的值。

还记得Tips3吗?我们说过如果修改文本框的属性名之后,那么这样设置之后,config中的值不会设置为客户输入的值,会始终是文本框中设置的默认值。

切记切记!!!重要的事情三个叹号!

2、使用自定义的dll文件

关于这点请见第六小节。

六、自定义dll

点击Custome Behavior->Custom Actions,选择.Net Installer Class action。这时会让你选择文件中的dll文件。

当然了,在此之前,请打开你的Visual Studio,新建一个类库项目,这里命名为InstallLandaV9ServiceT,然后新建一个安装程序类,重写Install方法。

到这里,我们先暂停一下,问一下自己:在程序中怎么接收从Advanced Installer传过来的参数呢?

假如此时我们已经将这个dll加入到Advanced Installer中,在Installer Class Paramters中可以添加参数。

比如将文件路径传到后台,可以这样添加:Name为FilePath,Value为[APPDIR]\。

这里有地方需要注意,传递文件路径时,Value为[APPDIR]\,这个"\"请不要漏掉了。

Tips4:传递文件路径时,Value为[APPDIR]\,这个"\"请不要漏掉了。

其他参数的Value,需要设置为对应文本框的属性名称,格式为:[属性名]。

下面来看一看代码:

public override void Install(IDictionary stateSaver)
{
    Parameters configParms = new Parameters();
    configParms.FilePath = Context.Parameters["FilePath"];
    configParms.ServerPath = Context.Parameters["ServerPath"];
    configParms.ClientPath = Context.Parameters["ClientPath"];
    configParms.DataSource = Context.Parameters["DataSource"];
    configParms.UserId = Context.Parameters["UserId"];
    configParms.Password = Context.Parameters["Password"];
    new Operators().UpdateLandaV9Config(configParms);
    base.Install(stateSaver);
}

这里主要接收从Advanced Installer中传过来的参数,接着在Operators类中更新配置文件。

还记得Tips3吗?如果在那里修改的属性名,那么这里接收的参数也是文本框的默认值。

这里面主要干了三件事,获取连接字符串,更新连接字符串,安装服务

public void UpdateLandaV9Config(Parameters configParms)
{
    string filePath = Path.Combine(configParms.FilePath, "LandaV9Service", "LandaEntryInfoService.exe.config");
    string connectionString = this.GetConnectionString(configParms);
    this.UpdateConnections(filePath, connectionString);this.InstallService(Path.Combine(configParms.FilePath, "LandaV9Service"));
}

还记得Tips4吗?如果在传递文件路径的时候只是写[APPDIR],而不是[APPDIR]\,那么程序运行到这里的时候,会抛“FileNotFound”异常!

下来来看一下具体的代码:

/// <summary>
/// 获取连接字符串
/// </summary>
/// <param name="op"></param>
/// <returns></returns>
public string GetConnectionString(Parameters op)
{
    return string.Format("Data Source={0};Initial Catalog=LandaEntryManager;Persist Security Info=True;User ID={1};Password={2}", op.DataSource, op.UserId, op.Password);
}

/// <summary>
/// 更新连接字符串
/// </summary>
/// <param name="filePath"></param>
/// <param name="conn"></param>
public void UpdateConnections(string filePath, string conn)
{
    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.Load(filePath);
    XmlElement xmlElement = (XmlElement)xmlDocument.SelectSingleNode("/configuration/connectionStrings/add[@name=‘LandaEntryManager‘]");
    if (xmlElement != null)
        xmlElement.SetAttribute("connectionString", conn);
    xmlDocument.Save(filePath);
}

再来看安装服务:

/// <summary>
/// 安装服务
/// </summary>
/// <param name="filePath"></param>
public void InstallService(string filePath)
{
    Environment.CurrentDirectory = filePath;
    Process process = new Process();
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.FileName = "Install.bat";
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.Verb = "runas";  //主要设置为以管理员启动
    process.Start();
}

有安装就有启动,可是如果紧跟其后写启动服务,会提示找不到服务,安装程序就会出错。

博主想了一个办法,重写OnAfterInstall方法,在这个方法里面写启动服务:

/// <summary>
/// 重启服务
/// </summary>
/// <param name="savedState"></param>
protected override void OnAfterInstall(IDictionary savedState)
{
    ServiceController serviceController = new ServiceController("LandaInformationServiceV9");
    serviceController.Start();
    base.OnAfterInstall(savedState);
}

这样就没问题了!

在这个程序集里面可以自定义你想做的其他事情,比如,还原数据库等等。

七、后记

本次教程到此结束,这也是博主在这几天假期摸索出来的,如果有不当之处,尽请指正!

附上Advanced Installer的官网地址:https://www.advancedinstaller.com/

希望本文对你有所帮助。如果你觉得本文能够帮助你,就点个赞吧。你的支持是博主继续坚持的不懈动力。

原文地址:https://www.cnblogs.com/liuyoung/p/8158070.html

时间: 2024-10-14 13:19:50

2018第一发:记一次【Advanced Installer】打包之旅的相关文章

Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法

原文:Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法 前几个月使用Advanced Installer 打包了一堆安装包,其中有使用默认主题的,也有根据UI设计更改过一些功能的,当时在Windows7下测试没有任何问题,就直接上线给用户使用了. 这两天在禅道上发现指派了一个BUG过来,描述的内容是在Windows10下安装包会出现重启后再次自动运行的问题,见鬼了,没有写过自启动注册表啊,马上打开工程查看,发现了一个很奇怪的现象,下面来介绍. 1.当

笔记:Advanced Installer 打包Web应用

原文:笔记:Advanced Installer 打包Web应用 公司要做一款增值税小产品,区别于ACME,本产品核心只有销项部分,面对的客户群是小企业,单税盒单开票机..... 我要做的主要有以下几点: 1.数据库改为SqlCE 2.统一安装配置VICA客户端,服务端(尽管VICA组同事不知道我要改这块^_^) 3.一键安装(支持32位,64位系统,暂时考虑NET4.5,Window7以上系统) 打包工具选择是Advanced Installer 12.7.2 制作安装包过程中遇到的问题: 1

(转)使用 Advanced Installer 打包 一键安装Web应用程序

使用 Advanced Installer 打包 一键安装Web应用程序 安装预览: 资源下载: 示例安装包 操作流程: 1.新建Asp.net Application. 2.设置应用程序名称和公司名称. 3.选择安装包分布类型.默认即可. 4.指定该项目和程序包的路径. 5.新建应用程序文件.点击新建文件和新建文件夹即可选择站点下的文件或文件夹. 6.配置应用程序运行时环境. 7.配置程序包的.Net Framework环境. 8.定义Web应用程序类型. 9.设置主机.端口等参数. 10.选

Advanced Installer 打包程序

AdvancedInstaller  使用 说明  https://blog.csdn.net/qq_20849387/article/details/78422081 Custom Actions(自定义动作) https://blog.csdn.net/qq_20849387/article/details/78426027 AdvancedInstaller用户自定义动作——卸载程序  https://blog.csdn.net/qq_20849387/article/details/78

InstallShield和Advanced Installer打包

现在一下免费的打包软件有很多 1.Advanced Installer2.Setup Factory3.Smart Install Maker 企业应用的推荐:Nullsoft.InstallShield,Advanced Installer 当然还有其他,下面主要说说我用过的两种InstallShield和Advanced Installer,介绍一下他们的激活和使用方法,各自的优点等等 一.环境介绍:Windows7旗舰版.VS 2013.InstallShield 13.Advanced

Advanced Installer 打包Winform程序

原文地址:https://www.cnblogs.com/123-com/p/12293739.html

Advanced Installer 11.9基于IIS打包札记(For MySQL)

原文:Advanced Installer 11.9基于IIS打包札记(For MySQL) Mysql免安装前期部署 下载绿色命令行版本的mysql,将其放入到发布的程序发布包内,执行Update批处理,输入自定义端口号,选一个不冲突的数字,比如3310: 运行scripts启动mysql服务 准备好数据库sql脚本,并且用navcat连接后新建一个空的数据库 打开命令行窗口,进入到mysql的bin目录 首先连接mysql,运行命令语句mysql -P3310 -uroot -p --def

利用Advanced Installer将asp.netMVC连同IIS服务和mysql数据库一块打包成exe安装包

原文:利用Advanced Installer将asp.netMVC连同IIS服务和mysql数据库一块打包成exe安装包 因为业务需要,项目中需要把asp.netmvc项目打包成exe安装程序给客户,让客户直接可以点下一步下一步安装部署web程序,并且同时要将IIS服务和mysql一同安装到服务器上,因为客户的电脑可能是64位也可能是32位,所以在打包的时候就需要打包成两份安装包.研究了几天终于有所收获,下边就是打包的步骤. 打包步骤: 一.前期准备 1.将asp.netmvc发布到本地目录中

用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解

关于 DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版--------------------------------------------------------- 基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DLL制作而成. 安装之后,直接就可以用了. 省心省事.不必再单独的打一次补丁包了. 本安装包和补丁包一样都删除了