接上一篇 继续使用上一篇的project 。将archive里无用的文件删除 添加我们需要的文件进来。

config是一个文本文件。 注意所有文件的 destination都是 %appfolder%   ,这代表程序 安装目录 setupfactory有很多这样的 全局变量 用起来非常方便 ,获取系统环境桌面目录 %desktop%  。 这类似 win批处理命令的%windir%  我们把目录改一下 %appfolder%\tools,这样安装时就可再创建子文件夹tools。

我们确确实实 想定义一个我们自己独有的 用户体验好的 安装包 ,我们不想千篇一律。

在screens ->before installing 选项卡:

把welcome to setup 删掉,然后在license agreement编写我们自己的 安装许可文本:

我们需要自定义一个对话框界面  用来让用户在安装过程中进行配置。在安装时也将针对用户的配置进行相应的处理。
添加一个我们自定义的安装配置界面:

User information ,Select shortcut folder 两屏也一并删掉。

在创建custom Screen的时候 “下一步”按钮的 脚本(单击 screens  ->before installing -> 选中custom ->ecit->actions- >On Next 选项卡):

 -- These actions are performed when the Next button is clicked.
-- advance to the next screen
--采集数据 并放到全局变量里
--端口
port = DlgEditField.GetProperties(CTRL_EDIT_01).Text;
--启动菜单加快捷方式
startup = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_01).Checked;
--桌面快捷方式
desktop = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_02).Checked;
--%StartupFolder%
runnow = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_03).Checked;
--是否有加密狗
softkey=DlgCheckBox.GetProperties(CTRL_CHECK_BOX_04).Checked;
--Dialog.Message("title ddf",txport.Text);
Screen.Next();

这个很简单 就是获取几个控件的值 并赋给变量,以便在稍后的过程中使用。

然后就是安装过程中针对用户的选项进行处理 ,安装过程不就是 他自动生成的 拷文件么 。要我们管毛线啊。我这里只是一个示范 我们根据用户选项追加配置文件 也就是config.ini 。首先执行此代码时 文件已经复制完毕 ,配置文件的目录在 %appfolder%  写文本文件  这样即可。

还是 screens-> after installing ->ecit->actions->onPreLoad:

 -- These actions are performed before the screen is shown.
--安装完成 进行初始化全局变量里面的配置
--端口,追加配置文件
TextFile.WriteFromString(SessionVar.Expand("%AppFolder%\\config.ini"), "\r\nport="..port, true);
--有无加密狗
if softkey then
TextFile.WriteFromString(SessionVar.Expand("%AppFolder%\\config.ini"), "\r\nhardwareIdType=softkey", true);
end if startup then
Shell.CreateShortcut("%StartupFolder%", "DcmPrintSCP", SessionVar.Expand("%AppFolder%\\NewScp.exe"), "", "%AppFolder%", "", , SW_SHOWNORMAL, nil, "shortcut for dcmprintscp");
end
--根据复选框选项创建快捷方式 的代码 这样就可以了。
if desktop then
Shell.CreateShortcut("%DesktopFolder%", "DcmPrintSCP", SessionVar.Expand("%AppFolder%\\NewScp.exe"), "", "%AppFolder%", "", , SW_SHOWNORMAL, nil, "shortcut for dcmprintscp");
end --卸载程序有问题 必须得新建一个快捷方式
Shell.CreateShortcut("%AppFolder%", "shortcut_uninstall", SessionVar.Expand("%AppFolder%\\uninstall.exe"), SessionVar.Expand("\"/U:%AppFolder%\\Uninstall\\uninstall.xml\"" ), "", "", , SW_SHOWNORMAL, nil, "shortcut for uninstall");

需要注意的:
字符串连接 是 ..这种方式 ,并不是C++里寻常的+号 也不是 VB里的& 连字符。

还有些需要注意的是 类vb 语法 并非完全跟vb一样  ,比如这段

if startup then

xxx

End

最后我们需要 自己搞一个banner  我已经搞好了 ,既然做东西就要注重细节。

程序启动时显示安装许可 ,然后是用户自定义配置选项  然后是选择安装目录。然后安装程序释放我们打包的文件到指定目录。 然后我们的脚步根据用户定义的配置选项追加配置文件 和创建桌面快捷方式 ,并且用户没有.netFramework框架 自动安装。就这样一个安装包就做好了。像我这种需求 基本上 大部分功能我都用不完  只是冰山一角。

我在这bilibili的半天 你都不厌其烦的看完了  你再 根据自己的实际需求  , 再啃啃帮助文档 就差不多了。

2016.8.24 时至今日  应公司业务需求 没想到我又在倒腾这玩意 。有看到了以前没注意到的东西 ,就像书样 重新读一遍又是一番滋味。
我说这脚本怎么这么灵活 这么强大呢,原来这脚本名叫LUA 是一种开源的经过成熟发展的东东,并且可以与C++写的dll形成互操作调用。 
只是这玩意写起来 找了半天 没什么工具 既没提示又没啥的 纯记事本的方式写 太tm蛋疼了。

你看博客的代码插入选项里都有Lua 是我两年前没发现他么

以前一直 打包系统必备项 打包系统必备项进安装包里 ,然后怎么怎么实现自动安装系统必备项。现在重要找到方式了 ,根本用不着倒腾dependencies
直接resources菜单 primer files 把.net安装文件加进去 ,界面上说了 执行的时候会自定释放到临时目录。

用注册表功能 检测.net是否安装:

 --.net版本检测

 dotnetVers=Registry.GetKeyNames(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\");
if (dotnetVers~= nil) then
for j,k in pairs(dotnetVers) do
if (String.Find(k,"4.0",,false)~= -) then
dotnetVer="4.0"
elseif (String.Find(k,"4.5",,false)~= -) then
dotnetVer="4.5"
end
end
end

还有需要值得注意的是,在这个设计界面随意插入控件:

按钮的事件在这里: ,先点到action去 

然后on ctr message 即是按钮事件代码:

找到附加文件的释放目录并进行自动安装,以前不知道这玩意执行时还可以带参数进行静默安装:

 Shell.Execute(SessionVar.Expand("%TempLaunchFolder%\\NetFramework4.0.exe"), "open", " /passive", "", SW_SHOWNORMAL, true)

通过SetProperties函数更改控件的值 显示隐藏等 ,通过GetProperties 获取值。

DlgEditField.SetProperties

记住 lua 还可以调用c++扩展。

基本上通过以上手段 加上lua强大的脚本控制逻辑 还有c++扩展的配合,你要制作什么样的安装包程序应该都可以倒腾出来 。

两个字 倒腾

.net程序部署(setupFactory进阶)的更多相关文章

  1. Tomcat负载均衡、调优核心应用进阶学习笔记(二):Tomcat前世今生、安装、配置文件详细说明、tomcat应用程序部署、webapp 体系结构、tomcat运行方式

    文章目录 Tomcat前世今生 安装 配置文件详细说明 tomcat应用程序部署 webapp 体系结构 tomcat运行方式 Tomcat前世今生 java体系: 1 java程序设计语言 2 ja ...

  2. .net程序部署(mono方式)

    某一次 我同事用了这个词 ,说这样才显得够专业 擦.把某某项目 部署到服务器上 .擦 不就是拷个文件过去运行么.月亮 还是绵羊  我搞不清楚了 咱英文不好,绵羊叫的声音?.你就叫我山寨程序猿 随意 一 ...

  3. deployment与Web应用程序部署

    定义用于支持 Web 应用程序部署的配置设置. <deployment retail="true|false" /> retail属性:设置一个值,该值指定是否以发布模 ...

  4. 使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台

    使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台. 前面讲解了VSCode开发调试 .NET Core.都只是在windows下运行. .NET Core真正的核心是跨平 ...

  5. IIS安装与MVC程序部署

    最近在做访客系统,虽然说不是什么多大的项目,但麻雀虽小五脏俱全,使用EF Code First+Mysql+Frozenui响应式布局,感觉通过这个项目学到好多东西,Mysql的使用.EF映射Mysq ...

  6. SNF开发平台WinForm之八-自动升级程序部署使用说明-SNF快速开发平台3.3-Spring.Net.Framework

    9.1运行效果: 9.2开发实现: 1.首先配置服务器端,把“SNFAutoUpdate2.0\服务器端部署“目录按网站程序进行发布到IIS服务器上. 2.粘贴语句,生成程序 需要调用的应用程序的Lo ...

  7. [翻译][MVC 5 + EF 6] 5:Code First数据库迁移与程序部署

    原文:Code First Migrations and Deployment with the Entity Framework in an ASP.NET MVC Application 1.启用 ...

  8. C#程序部署到Android

    C#是一种优秀的编程语言,语法之优雅,代码之简洁使得众多软粉多年来对她不离不弃. 但是如何将C#程序部署到Linux, Android等平台,这当然是得依靠众所周知的Mono. 本文Demo程序比较简 ...

  9. winform/wpf 程序部署

    (1):一些发布方式 ClickOnce是什么玩意儿,这个问题嘛,在21世纪的互联网严重发达的时代,估计也没有必要大费奏章去介绍了,弄不好的话,还有抄袭之嫌.因此,有关ClickOnce的介绍,各位朋 ...

  10. 2017PHP程序员的进阶之路

    2017PHP程序员的进阶之路 又是一年毕业季,可能会有好多毕业生即将进入开发这个圈子,踏上码农这个不归路.根据这些年在开发圈子总结的LNMP程序猿发展轨迹,结合个人经验体会,总结出很多程序员对未来的 ...

随机推荐

  1. .Net Core MVC 网站开发(Ninesky) 2.2、栏目管理功能-System区域添加

    在asp或asp.net中为了方便网站的结构清晰,通常把具有类似功能的页面放到一个文件夹中,用户管理功能都放在Admin文件夹下,用户功能都放在Member文件夹下,在MVC中,通常使用区域(Area ...

  2. 关于 CSS 反射倒影的研究思考

    原文地址:https://css-tricks.com/state-css-reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览.该文章篇幅较长,内容庞杂,有 ...

  3. JS魔法堂:不完全国际化&本地化手册 之 理論篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  4. python 数据类型---文件二

    1.打印进度条 import sys,time for i in range(20): sys.stdout.write("#") sys.stdout.flush() #不等缓冲 ...

  5. MVC还是MVVM?或许VMVC更适合WinForm客户端

    最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』.相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的 ...

  6. Dynamics CRM 2015-Data Encryption激活报错

    在CRM的日常开发中,Data Encryption经常是不得不开启的一个功能.但是有时,我们可能遇到一种情况,Organization导入之后,查看Data Encryption是已激活的状态,但是 ...

  7. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  8. SQL Server 批量删除存储过程

    原理很简单的'drop proc xxx'即可,下面有提供了两种方式来删除存储过程,其实本质是相同的,方法一是生成删除的sql后直接执行了,方法二会生成SQL,但需要检查后执行,个人推荐第二种做法. ...

  9. 二次剩余、三次剩余、k次剩余

    今天研究了一下这块内容...首先是板子 #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  10. Vue.js——60分钟browserify项目模板快速入门

    概述 在之前的一系列vue.js文章,我们都是用传统模式引用vue.js以及其他的js文件的,这在开发时会产生一些问题. 首先,这限定了我们的开发模式是基于页面的,而不是基于组件的,组件的所有代码都直 ...