WISE902安装包制作工具实战指南
简介:WISE902是一款专业的Windows安装包制作工具,支持创建用户友好、功能完整的安装程序,广泛用于软件部署与分发。通过该工具,开发者可将应用程序及其依赖文件打包为自解压安装程序,实现自动化安装、多语言支持、条件安装和卸载功能。本文详细介绍了WISE902的项目创建流程、目录结构定义、用户界面定制、脚本添加及安装序列设置,并强调了readme.txt在提供版本信息、系统需求和技术支持中的重要作用。使用WISE902不仅能提升部署效率,还可增强软件的专业性和兼容性。
1. WISE902工具简介与应用场景
WISE902是一款面向企业级软件部署的安装包制作工具,专用于构建高效、稳定且可定制化的Windows平台安装程序。它支持组件化管理、多语言界面、条件逻辑控制及注册表和服务项集成,广泛应用于大型软件系统的分发与升级场景。通过图形化开发环境与脚本引擎结合,WISE902实现了从资源组织到安装流程编排的全生命周期管理,适用于需复杂配置和高兼容性要求的工业级部署需求。
2. 安装包项目创建与基础配置
在现代软件交付流程中,构建一个稳定、可维护且用户友好的安装包已成为产品发布不可或缺的一环。WISE902作为一款专业的安装包制作工具,提供了从项目初始化到打包发布的全流程支持,尤其适用于企业级应用部署、跨平台分发以及复杂依赖管理场景。本章将深入探讨如何使用 WISE902 创建安装包项目,并完成必要的基础配置工作,为后续的资源导入、路径设置和用户界面定制打下坚实的技术基础。
安装包项目的创建并非简单的文件打包操作,而是一个涉及开发环境准备、项目结构设计、编译参数设定及目标平台适配的系统工程。尤其对于拥有多年 IT 经验的开发者而言,理解这些底层机制有助于提升构建效率、降低后期维护成本,并确保安装过程的安全性与一致性。以下内容将围绕“开发环境搭建”、“新建项目流程”和“项目属性配置”三大核心模块展开,结合实际操作步骤、代码示例与可视化图表,全面解析 WISE902 在项目初始阶段的关键技术要点。
2.1 WISE902开发环境搭建
构建高质量的安装包首先依赖于一个稳定可靠的开发环境。WISE902 虽然具备图形化操作界面,但其背后仍然需要一系列系统级组件的支持才能正常运行。因此,在正式开始项目创建之前,必须完成软件安装、授权激活以及环境兼容性验证等前置任务。
2.1.1 软件安装与授权激活
WISE902 的安装过程遵循标准 Windows 应用程序安装规范,支持 .exe 安装包和静默部署两种方式。推荐在独立的虚拟机或专用构建服务器上进行安装,以避免与其他开发工具产生冲突。
安装流程说明:
- 下载官方发布的
WISE902_Setup.exe安装程序; - 以管理员权限运行安装程序;
- 指定安装路径(建议使用默认路径
C:\Program Files\WISE902); - 选择组件:IDE 主程序、命令行构建工具(CLI)、调试插件、文档帮助系统;
- 等待安装完成并重启系统(部分驱动需加载)。
# 示例:静默安装命令(适用于自动化构建环境)
Start-Process -FilePath "WISE902_Setup.exe" `
-ArgumentList "/S", "/D=C:\Tools\WISE902" `
-Wait
逻辑分析 :
上述 PowerShell 脚本通过Start-Process启动安装程序,并传入/S参数表示静默安装(无 GUI),/D=指定目标目录。-Wait参数确保脚本等待安装进程结束再继续执行,适合 CI/CD 流水线集成。参数说明 :
-/S:静默模式,不显示任何对话框;
-/D=path:自定义安装目录;
- 其他可选参数包括/LOG=install.log记录安装日志,便于排查问题。
安装完成后,必须进行授权激活。WISE902 支持在线激活和离线许可证文件( .lic )两种方式。企业用户通常采用离线授权以满足内网隔离需求。
授权激活流程(离线模式):
- 打开 WISE902 IDE,进入【Help】→【License Activation】;
- 点击【Generate Request File】生成硬件指纹请求文件(
.req); - 将
.req文件发送至供应商获取对应的.lic文件; - 使用【Import License】导入许可证;
- 验证状态是否为“Active”。
| 授权类型 | 适用场景 | 是否支持多设备 | 网络要求 |
|---|---|---|---|
| 在线激活 | 开发者个人使用 | 否 | 需持续联网 |
| 离线授权 | 企业内网部署 | 是(绑定MAC/IP) | 初始导入后无需联网 |
| 浮动许可 | 团队共享许可证池 | 是 | 需连接内部License Server |
graph TD
A[启动WISE902] --> B{检测许可证}
B -->|未找到| C[生成.req请求文件]
C --> D[提交给供应商]
D --> E[获取.lic文件]
E --> F[导入许可证]
F --> G[验证激活状态]
G --> H[进入主界面]
B -->|已存在有效许可| H
该流程图清晰地展示了离线授权的完整链路,体现了企业在安全合规前提下的灵活部署能力。
2.1.2 开发环境依赖检查与系统兼容性验证
即使成功安装了 WISE902,仍需确认其运行所需的底层依赖是否齐全。常见的依赖项包括 .NET Framework 版本、Visual C++ 运行库、Windows Installer Service 和 MSI SDK。
必要依赖清单:
| 依赖项 | 最低版本 | 安装位置 | 检查方法 |
|---|---|---|---|
| .NET Framework | 4.7.2 | C:\Windows\Microsoft.NET\Framework\ | reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release |
| Visual C++ Redistributable | 2019 x64 | Program Files\Common Files | wmic product get name \| findstr "Visual C++" |
| Windows Installer | v5.0 | 内置于OS | msiexec /? 查看帮助信息 |
| WiX Toolset(可选) | v3.11+ | 外部集成工具 | candle.exe -h 测试是否存在 |
可通过批处理脚本自动检测关键依赖是否就绪:
@echo off
echo 正在检查开发环境依赖...
:: 检查 .NET 4.7.2+
for /f "tokens=3" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release 2^>nul') do set dotnet_release=%%a
if %dotnet_release% LSS 461808 (
echo ERROR: .NET Framework 4.7.2 或更高版本未安装!
exit /b 1
)
:: 检查 VC++ 2019 Runtime
wmic product get name | findstr "Microsoft Visual C++ 2019" >nul
if errorlevel 1 (
echo WARNING: Visual C++ 2019 可再发行组件缺失,可能影响运行时稳定性。
)
:: 检查 msiexec 是否可用
where msiexec >nul 2>&1
if errorlevel 1 (
echo ERROR: Windows Installer 服务未启用或损坏!
exit /b 1
)
echo 所有基本依赖检查通过。
exit /b 0
逐行解读 :
第1–2行:关闭命令回显并输出提示信息;
第5–8行:查询注册表中的.NET版本号(Release值),461808对应4.7.2);
第11–14行:使用wmic查询已安装程序列表,判断VC++是否安装;
第17–20行:检查msiexec是否存在于系统路径中,验证Windows Installer服务可用性;
最终根据结果返回不同退出码,可用于CI脚本中断判断。
此外,还需验证操作系统兼容性。WISE902 主要支持以下平台:
| 操作系统 | 架构 | 支持级别 | 备注 |
|---|---|---|---|
| Windows 10 (1809+) | x64/x86 | 完全支持 | 建议更新至最新补丁 |
| Windows 11 | x64 | 完全支持 | UI渲染优化更好 |
| Windows Server 2016+ | x64 | 支持 | 适用于远程桌面部署 |
| Windows 7 SP1 | x64 | 有限支持 | 不推荐用于新项目 |
建议开发团队统一使用 Windows 10 21H2 或以上版本作为基准开发环境,以减少因 OS 差异导致的构建失败风险。
2.2 新建安装项目的基本流程
完成环境准备后,即可启动 WISE902 并创建新的安装项目。项目创建是整个打包流程的起点,直接影响后续所有配置的组织结构和输出行为。
2.2.1 选择项目类型与目标平台
WISE902 提供多种预设项目模板,针对不同的应用场景进行了优化。首次创建项目时,应在主界面点击【File】→【New Project】打开向导。
可选项目类型:
| 类型 | 用途 | 输出格式 | 适用场景 |
|---|---|---|---|
| Standard EXE Setup | 标准安装程序 | .exe 自解压包 | 普通桌面应用分发 |
| MSI Installer | Windows Installer 包 | .msi | 企业组策略部署、SCCM 分发 |
| Web Installer | 网络安装引导器 | .exe (下载器) | 减小初始体积,按需下载组件 |
| Portable App | 免安装绿色版 | 单目录压缩包 | U盘便携运行 |
| Patch Update | 增量补丁包 | .msp | 版本升级修复 |
推荐大多数情况选择 Standard EXE Setup ,因其灵活性高、兼容性强,且支持数字签名和反安装功能。
接下来需指定目标平台架构:
- x86 :32位系统,兼容老设备;
- x64 :64位系统,推荐现代应用;
- AnyCPU :自动探测系统位数(需注意DLL加载问题);
<!-- 项目配置文件片段:TargetPlatform 设置 -->
<Project>
<PropertyGroup>
<OutputType>EXE</OutputType>
<TargetPlatform>x64</TargetPlatform>
<CompressionLevel>High</CompressionLevel>
<EnableUAC>true</EnableUAC>
</PropertyGroup>
</Project>
参数说明 :
-OutputType:决定最终输出格式;
-TargetPlatform:影响打包时的二进制对齐与API调用方式;
-CompressionLevel:控制打包压缩率,High 可减小体积但增加构建时间;
-EnableUAC:是否请求管理员权限,默认 true,防止写入Program Files失败。
选择完成后,系统会自动生成项目骨架目录结构:
MyAppInstaller/
├── Project.wiseproj # 主项目文件
├── Source/ # 原始资源目录
├── Scripts/ # 安装前后脚本
├── Output/ # 编译输出目录
└── Logs/ # 构建日志存放
此结构遵循模块化设计理念,便于版本控制与团队协作。
2.2.2 初始化项目参数与命名规范
良好的命名规范不仅能提高项目可读性,还能增强自动化脚本的识别能力。在项目创建过程中,应明确填写以下元数据字段:
| 字段 | 示例值 | 作用 |
|---|---|---|
| Project Name | MyApp_Installer_v2.3.1 | 项目名称,用于标识 |
| Product Name | MyEnterpriseApp | 最终显示在“添加或删除程序”中的名称 |
| Version | 2.3.1.0 | 四段式版本号,影响升级逻辑 |
| Manufacturer | Acme Corp Ltd. | 公司名称,出现在UAC提示中 |
| GUID | {A1B2C3D4-E5F6-7890-ABCD-EFGHIJKLMN} | 唯一标识符,不可重复 |
GUID 的生成建议使用 WISE902 内置工具或 PowerShell:
# 自动生成 GUID
$guid = [System.Guid]::NewGuid().ToString("B").ToUpper()
Write-Host "Generated GUID: $guid"
输出示例:
Generated GUID: {A1B2C3D4-E5F6-7890-ABCD-EFGHIJKLMN}
该 GUID 将被写入 .wiseproj 文件中,作为产品的唯一身份标识。若更换 GUID,则系统视其为全新应用,无法实现增量更新。
命名规范建议采用如下格式:
- 项目文件名:
<ProductName>_Installer_<Version>.wiseproj - 输出安装包名:
<ProductName>-v<Version>-Setup.exe - 日志文件名:
build_<timestamp>.log
例如:
- 项目文件: MyApp_Installer_v2.3.1.wiseproj
- 输出包: MyApp-v2.3.1-Setup.exe
这种命名方式有利于自动化构建系统(如 Jenkins、GitLab CI)进行版本追踪与归档管理。
2.3 项目属性配置详解
项目属性是控制安装包行为的核心配置集合,涵盖产品信息、输出路径、编译选项等多个维度。正确设置这些属性可显著提升安装体验和部署可靠性。
2.3.1 产品名称、版本号与厂商信息设置
在 WISE902 IDE 中,通过右键项目 → 【Properties】打开属性面板。关键字段如下:
[General]
ProductName=MyEnterpriseApp
Version=2.3.1.0
Manufacturer=Acme Corp Ltd.
URL=https://www.acmecorp.com
SupportPhone=+86-123-4567-8900
这些信息不仅用于安装界面展示,还会影响 Windows 注册表记录和“应用程序和功能”列表中的条目内容。
特别需要注意的是 版本号格式 。WISE902 要求使用四段式版本号(Major.Minor.Build.Revision),否则可能导致升级检测失败。例如:
// C# 示例:比较两个版本号
Version current = new Version("2.3.1.0");
Version latest = new Version("2.3.2.0");
if (latest > current)
{
Console.WriteLine("发现新版本!");
}
逻辑分析 :.NET 的
Version类支持逐段比较,先比主版本,再依次向下。因此2.3.2.0 > 2.3.1.0成立,触发更新逻辑。
此外,厂商信息(Manufacturer)会影响安装目录的默认位置:
- 若 Manufacturer = “Acme Corp Ltd.”,则默认安装路径为:
C:\Program Files\Acme Corp Ltd.\MyEnterpriseApp\
这有助于避免不同公司产品之间的路径冲突。
2.3.2 输出路径与编译选项的合理规划
合理的输出路径管理对于构建系统的稳定性至关重要。应在项目属性中明确设置:
| 属性 | 推荐值 | 说明 |
|---|---|---|
| Output Directory | ..\Build\Output\ | 与源码分离,便于清理 |
| Intermediate Directory | ..\Build\Temp\ | 存放临时编译文件 |
| Log Directory | ..\Build\Logs\ | 构建日志集中管理 |
| Compression Algorithm | LZMA | 高压缩比,适合大文件 |
| Build Configuration | Release | 启用优化,禁用调试符号 |
flowchart LR
SourceFiles --> Compiler --> Compressor --> OutputPackage
Compiler -->|Intermediate Files| TempDir
Compressor -->|Log Output| LogDir
该流程图展示了从源文件到最终安装包的构建流,强调中间目录与输出路径的分离原则。
此外,建议启用“增量构建”功能,仅重新编译变更部分,大幅缩短构建时间:
<PropertyGroup>
<IncrementalBuildEnabled>true</IncrementalBuildEnabled>
<SkipUnchangedFiles>true</SkipUnchangedFiles>
</PropertyGroup>
参数说明 :
-IncrementalBuildEnabled:开启增量构建;
-SkipUnchangedFiles:跳过未修改的资源文件,节省I/O开销。
最后,建议在 CI/CD 环境中使用命令行方式进行构建:
# 使用 WISE902 CLI 工具编译项目
wisebuild.exe "MyApp_Installer_v2.3.1.wiseproj" --config=Release --output=..\Artifacts\
该命令可在无人值守环境下自动完成打包,配合 Git Tag 实现版本自动化发布。
综上所述,本章详细阐述了 WISE902 安装包项目的创建与基础配置全过程,覆盖环境搭建、项目初始化与属性设置三大核心环节,为后续高级功能实现奠定了坚实基础。
3. 软件文件整理与资源导入
在现代软件分发体系中,安装包不仅是程序部署的载体,更是用户体验的第一道入口。一个结构清晰、组织严谨的安装资源体系,能够显著提升打包效率、降低维护成本,并为后续的版本迭代和增量更新提供坚实基础。WISE902作为一款专业的安装包制作工具,其核心能力之一便是对复杂软件资源进行高效整合与智能管理。本章将深入探讨如何基于 WISE902 构建科学合理的文件组织架构,实现从原始构建产物到可发布安装包之间的无缝衔接。
3.1 安装资源的分类与组织策略
软件安装过程中涉及的资源类型繁多,涵盖可执行文件、动态链接库(DLL)、配置文件、日志模板、帮助文档、图标资源以及第三方依赖组件等。若缺乏统一规划,极易导致项目混乱、冗余堆积甚至部署失败。因此,在进入 WISE902 打包流程之前,必须建立一套标准化的资源分类与组织策略。
3.1.1 可执行文件、动态库与配置文件的归类
合理的资源归类是确保安装包稳定运行的前提。通常建议按照功能模块与部署层级划分目录结构:
| 资源类型 | 存放路径示例 | 说明 |
|---|---|---|
| 主程序可执行文件 | \bin\app.exe | 核心启动程序,应置于根级 bin 目录 |
| 动态链接库 | \bin\*.dll | 包括 C++ 运行时、业务逻辑 DLL 等 |
| 配置文件 | \config\app.config , \settings.ini | 支持运行时参数注入,需支持用户修改 |
| 第三方依赖库 | \lib\third_party\* | 如 OpenSSL、Boost、Qt 库等 |
| 日志与缓存模板 | \data\logs\template.log | 初始化日志结构,便于后期重定向 |
| 帮助文档 | \doc\help.chm , \README.md | 提供离线使用指导 |
| 资源文件 | \res\icons\ , \res\langs\ | 图标、语言包、皮肤资源等 |
该结构遵循“单一职责”原则,每个目录仅承载特定类型的资源,避免交叉污染。例如,不建议将 .dll 文件散落在多个子目录中,除非存在明确的插件化设计需求。
此外,还需注意平台差异带来的路径兼容性问题。Windows 平台推荐使用反斜杠 \ 作为路径分隔符,但在 WISE902 内部处理时会自动转换为跨平台安全格式。对于需要区分 x86/x64 架构的 DLL,建议采用如下结构:
\bin\
\x86\
mymodule.dll
\x64\
mymodule.dll
这样可以在安装阶段根据目标系统位数选择正确的二进制文件。
资源命名规范的重要性
命名应体现版本信息、用途及来源。例如:
-
MyApp_v2.3.1_Release.exe—— 明确标明产品名、版本号与构建类型 -
libcrypto-1_1-x64.dll—— 来自 OpenSSL 项目,64位版本 -
config_template_prod.json—— 生产环境配置模板
通过规范化命名,可以有效防止误替换或加载错误版本的问题。
目录结构的可扩展性设计
随着功能扩展,未来可能引入插件机制或微服务架构。为此,初始结构应预留扩展空间:
\MyApplication\
├── bin/ # 可执行文件与主 DLL
├── config/ # 配置文件
├── data/ # 运行时数据、数据库模板
├── plugins/ # 插件模块(未来扩展)
├── logs/ # 初始日志目录(安装时创建)
├── temp/ # 临时文件夹占位
└── res/ # 资源文件(图像、语言、样式)
此结构具备良好的横向扩展能力,支持模块化开发与独立部署。
graph TD
A[软件资源] --> B[可执行文件]
A --> C[动态链接库]
A --> D[配置文件]
A --> E[第三方依赖]
A --> F[静态资源]
B --> G[主程序 .exe]
C --> H[CRT Runtime]
C --> I[业务逻辑 DLL]
D --> J[XML/JSON 配置]
D --> K[INI 设置文件]
E --> L[OpenSSL]
E --> M[SQLite]
F --> N[Icons/Images]
F --> O[Localization Files]
style A fill:#f9f,stroke:#333;
style B fill:#bbf,stroke:#333;
style C fill:#bbf,stroke:#333;
style D fill:#bbf,stroke:#333;
上述流程图展示了典型企业级应用的资源构成及其依赖关系,有助于开发者在导入前完成全景梳理。
3.1.2 资源完整性校验与依赖分析
一旦完成初步归类,下一步是验证所有资源的完整性与依赖一致性。任何缺失或版本错配的组件都可能导致运行时崩溃。
使用 Dependency Walker 分析 DLL 依赖
以 app.exe 为例,可通过 Dependency Walker 工具扫描其直接与间接依赖:
depends.exe /qe app.exe
输出结果将列出所有被引用的 DLL 及其加载状态(如 Missing、Delayed Import)。重点关注以下几类问题:
- MSVCRxx.DLL 缺失 :表明 Visual C++ Redistributable 未包含或目标机未安装
- API-MS-WIN-CRT-*.DLL 报错 :常见于 Windows 7 上运行新版编译程序,需启用 UCRT 补丁
- 延迟加载但实际不存在 :某些插件机制使用 LoadLibrary,工具无法静态检测,需手动验证
解决方案包括:
1. 将必要的 CRT 库打包进 \bin\ 或专用 \redist\ 目录;
2. 在安装脚本中添加 VC++ 运行库检查并提示下载;
3. 使用 /MT 静态链接替代 /MD ,减少外部依赖(牺牲体积换取稳定性)。
SHA256 校验保证资源一致性
为防止传输过程中的损坏或篡改,应对关键文件生成哈希值清单:
Get-FileHash -Algorithm SHA256 .\bin\*.exe, .\bin\*.dll | Export-Csv -Path "hashes.csv" -NoTypeInformation
输出示例:
| Algorithm | Hash | Path |
|---|---|---|
| SHA256 | A1B2C3D4… | bin\app.exe |
| SHA256 | E5F6G7H8… | bin\business_logic.dll |
在 WISE902 的“预安装检查”阶段,可通过自定义脚本读取当前文件哈希并与预存值比对,确保无篡改。
自动化依赖扫描脚本示例
以下 Python 脚本可用于批量分析目录内所有 EXE/DLL 的依赖项:
import os
import pefile
from collections import defaultdict
def scan_dependencies(root_dir):
dependencies = defaultdict(set)
for dirpath, _, filenames in os.walk(root_dir):
for f in filenames:
if f.lower().endswith(('.exe', '.dll')):
filepath = os.path.join(dirpath, f)
try:
pe = pefile.PE(filepath)
for entry in pe.DIRECTORY_ENTRY_IMPORT:
libname = entry.dll.decode().lower()
dependencies[f].add(libname)
except Exception as e:
print(f"[ERROR] {filepath}: {e}")
return dependencies
# 调用示例
deps = scan_dependencies("./bin")
for exe, libs in deps.items():
print(f"{exe}:")
for lib in sorted(libs):
print(f" - {lib}")
代码逻辑逐行解读:
-
import pefile:引入用于解析 PE 格式(Windows 可执行文件)的第三方库; -
scan_dependencies(root_dir):定义主函数,接收根目录路径; -
defaultdict(set):使用集合去重保存每个文件的依赖列表; -
os.walk():递归遍历指定目录下的所有文件; -
pe = pefile.PE(filepath):加载 PE 文件头信息; -
DIRECTORY_ENTRY_IMPORT:提取导入表,获取其所调用的 DLL 名称; -
.decode().lower():将字节串转为小写字符串以便统一比较; - 异常捕获防止损坏文件导致程序中断;
- 最终输出每份二进制文件所依赖的外部模块名称。
该脚本可用于 CI/CD 流水线中,作为打包前的自动化质量门禁。
3.2 文件导入操作实践
完成资源整理后,需将其导入 WISE902 项目中。该过程不仅仅是简单的“拖拽”,更涉及虚拟文件系统的构建、安装映射规则设定以及符号链接处理等高级特性。
3.2.1 使用WISE902资源管理器添加文件
WISE902 提供图形化的“资源管理器”面板,支持多种方式导入文件:
方法一:手动拖放
将本地 \build\output\* 目录中的内容直接拖入 WISE902 的“Files and Folders”视图区域。系统会自动识别文件类型并分配默认属性(如是否可执行、是否隐藏)。
方法二:批量导入向导
点击菜单栏 Project > Add Files from Directory ,弹出向导窗口:
- 选择源路径(如
C:\BuildOutput\v3.0.0) - 设置过滤规则(如
*.exe; *.dll; *.config) - 启用“递归子目录”选项
- 指定目标安装路径映射(如
[ProgramFilesFolder]\MyCompany\MyApp)
向导完成后,所有匹配文件将以树形结构展现在项目中。
方法三:脚本化导入(适用于自动化构建)
通过 WISE902 SDK 提供的 COM 接口,可用 VBScript 实现自动化导入:
Set project = CreateObject("WiseScript.Project")
project.Open("C:\Projects\MyApp.wis")
Set filesNode = project.GetObject("Files and Folders")
filesNode.AddDirectory "C:\BuildOutput\bin", "[INSTALLDIR]\bin"
filesNode.AddFile "C:\BuildOutput\config\app.config", "[INSTALLDIR]\config\app.config"
project.Save()
project.Close()
参数说明:
- "WiseScript.Project" :WISE902 暴露的自动化对象模型入口;
- GetObject("Files and Folders") :获取资源节点句柄;
- AddDirectory(src, dst) :递归添加整个目录, dst 使用安装时变量(如 [INSTALLDIR] );
- [INSTALLDIR] :标准属性,指向用户选择的安装路径。
该脚本可在 Jenkins 或 Azure DevOps 中调用,实现无人值守打包。
导入后的元数据设置
导入后,应对关键文件设置属性:
| 属性字段 | 推荐值 | 作用 |
|---|---|---|
| Component | 自动生成或手动指定 | 控制安装/卸载粒度 |
| Attributes | Normal / System / Hidden | 影响文件可见性 |
| Condition | VersionNT >= 601 | 限制仅 Win7+ 安装 |
| KeyPath | 是(仅限主 EXE) | 决定组件是否已安装 |
| NeverOverwrite | True(针对配置文件) | 防止覆盖用户修改 |
合理设置这些属性,可避免升级时误删用户数据或引发权限冲突。
3.2.2 目录映射与虚拟文件系统构建
WISE902 使用“虚拟文件系统”(Virtual File System, VFS)模型来描述安装时的目标路径布局。它允许将物理资源映射到不同逻辑位置,尤其适用于多用户环境或注册表集成场景。
典型映射关系表
| 源路径(项目内) | 目标安装路径(变量表示) | 示例展开结果 |
|---|---|---|
\bin\app.exe | [ProgramFilesFolder]\MyApp\bin\app.exe | C:\Program Files\MyApp\bin\app.exe |
\config\app.config | [AppDataFolder]\MyApp\config.user | C:\Users\John\AppData\Roaming\MyApp\config.user |
\docs\help.pdf | [UserDesktop]\MyApp Help.lnk | 桌面快捷方式指向帮助文档 |
\service\myservice.exe | [SystemFolder]\myservice.exe | 注册为系统服务 |
其中,方括号内的均为 Windows Installer 预定义属性(Properties),由安装引擎在运行时解析。
跨用户数据隔离的设计
对于需要区分当前用户与公共数据的场景,应使用以下策略:
<!-- WISE902 XML 片段 -->
<Directory Id="AppDataPerUser" Name="MyAppData">
<Component Id="UserConfig" Guid="*">
<File Source="config.user"
Destination="[AppDataFolder]\MyApp\"
NeverOverwrite="yes"/>
</Component>
</Directory>
<Directory Id="CommonAppData" Name="CommonMyApp">
<Component Id="SharedLogs" Guid="*">
<File Source="logs\template.log"
Destination="[CommonAppDataFolder]\MyApp\logs\" />
</Component>
</Directory>
此处利用了 [AppDataFolder] (当前用户专属)与 [CommonAppDataFolder] (所有用户共享)的区别,实现权限分离。
flowchart LR
subgraph "物理资源"
A[\bin\app.exe]
B[\config\app.config]
C[\res\logo.png]
end
subgraph "虚拟文件系统"
D[[ProgramFilesFolder]]
E[[AppDataFolder]]
F[[StartMenu]]
end
A --> D
B --> E
C --> F
style D fill:#dff,stroke:#333
style E fill:#dfd,stroke:#333
style F fill:#fdd,stroke:#333
该流程图清晰表达了物理文件如何映射到不同的虚拟安装位置,体现了 WISE902 对复杂部署场景的支持能力。
3.3 版本控制与资源更新机制
安装包的生命周期远不止一次发布,频繁的补丁更新要求我们建立可靠的版本追踪与资源更新机制。
3.3.1 增量更新的设计思路
增量更新旨在仅打包发生变化的文件,从而减小发布包体积、加快下载速度。其实现依赖于两个核心技术: 版本对比 与 差分压缩 。
版本对比策略
每次构建新版本时,应记录上一版的文件指纹(如 SHA256 + Size),并与当前构建输出比较:
import hashlib
import json
def get_file_fingerprint(path):
h = hashlib.sha256()
with open(path, 'rb') as f:
h.update(f.read())
return {
'size': os.path.getsize(path),
'sha256': h.hexdigest()
}
# 加载旧版本指纹
with open('last_version.json', 'r') as f:
last = json.load(f)
# 当前构建输出
current = {}
for file in os.listdir('./build/output'):
fp = get_file_fingerprint(f'./build/output/{file}')
current[file] = fp
# 检测变更
changed = []
for name, curr in current.items():
prev = last.get(name)
if not prev or prev['sha256'] != curr['sha256']:
changed.append(name)
print("Changed files:", changed)
输出结果可用于生成差异包(Delta Package),仅包含 changed 列表中的文件。
差分压缩工具集成
可结合微软的 msdelta API 或开源工具如 bsdiff 实现二进制差分:
bsdiff old/app.exe new/app.exe delta/app.exe.patch
安装时通过补丁应用工具还原最新版本,节省带宽达 70% 以上。
3.3.2 文件覆盖策略与备份机制实现
在升级安装时,如何处理已有文件至关重要。WISE902 提供三种主要策略:
| 策略 | WISE902 设置 | 适用场景 |
|---|---|---|
| Always Overwrite | NeverOverwrite=False | 主程序、DLL 更新 |
| Never Overwrite | NeverOverwrite=True | 用户配置文件 |
| Overwrite if Newer | 默认行为(基于版本号或时间戳) | 日志模板、资源文件 |
配置文件备份方案
为防止升级丢失用户设置,建议在覆盖前自动备份:
' Custom Action: BackupConfigFile.vbs
Dim fso, src, bak
Set fso = CreateObject("Scripting.FileSystemObject")
src = Session.Property("INSTALLDIR") & "config\app.config"
bak = Session.Property("APPDATA") & "\MyApp\backup\app.config.bak_" & Now()
If fso.FileExists(src) Then
If Not fso.FolderExists(Session.Property("APPDATA") & "\MyApp\backup") Then
fso.CreateFolder(Session.Property("APPDATA") & "\MyApp\backup")
End If
fso.CopyFile src, bak
End If
此脚本应在“安装前”阶段执行,确保原始配置得到保留。
综上所述,科学的文件组织、精准的依赖分析、灵活的映射机制与稳健的更新策略共同构成了高质量安装包的技术基石。掌握这些方法,不仅能提升打包效率,更能从根本上保障软件交付的可靠性与可维护性。
4. 目录结构设计与安装路径设置
在现代软件分发体系中,一个清晰、合理且符合操作系统规范的目录结构设计,是确保应用程序稳定运行、易于维护和提升用户体验的关键环节。WISE902作为一款功能强大的安装包制作工具,提供了对安装路径与目录架构的精细化控制能力,支持从默认系统路径到用户自定义位置的灵活配置,并能结合权限模型、磁盘状态和安全策略进行动态调整。本章将深入探讨如何基于 WISE902 工具构建科学的安装目录逻辑架构,实现路径可配置性、合法性验证机制以及快捷方式和服务项的智能生成规则。
合理的目录结构不仅影响程序自身的部署效率,还直接关系到后续升级、卸载、日志管理及多用户环境下的隔离能力。尤其在企业级应用或跨平台发布场景下,必须充分考虑不同操作系统(如 Windows 不同版本)对文件路径的访问限制、权限继承机制和注册表联动行为。因此,在使用 WISE902 创建安装项目时,开发者需具备对 Windows 文件系统层级结构的基本认知,理解 Program Files、AppData、Common Files 等标准路径的作用域及其安全特性。
此外,随着用户个性化需求的增长,允许用户选择安装路径已成为标配功能。然而,开放自由路径输入也带来了潜在风险——非法字符、空间不足、权限缺失等问题可能导致安装失败甚至系统异常。为此,WISE902 提供了路径预设、实时校验、容量检测等机制,可在图形化界面中引导用户完成安全路径选择。同时,通过脚本扩展接口,还可实现更复杂的路径逻辑判断,例如根据已安装组件自动推荐共用目录,或为便携式版本创建独立沙箱环境。
更为关键的是,安装路径的选择往往与快捷方式、启动项、服务注册等行为紧密关联。若主程序路径发生变化而相关引用未同步更新,则可能造成“找不到可执行文件”的错误。因此,整个安装流程中的路径变量必须统一管理,采用符号化引用而非硬编码方式传递。WISE902 支持内置变量(如 [INSTALLDIR] 、 [ProgramFilesFolder] )与自定义属性绑定,使得所有资源引用均可动态解析,从而保障路径变更后的整体一致性。
以下章节将逐步展开安装目录的设计原则、用户可配置路径的实现方法,以及快捷方式与启动项的自动化生成机制,辅以实际操作步骤、代码示例和流程图解,帮助开发者构建高可用、高兼容性的安装包体系。
4.1 安装目录的逻辑架构设计
在构建企业级或复杂应用的安装包时,安装目录的逻辑架构设计远不止于简单的“把文件放进某个文件夹”。它本质上是一种系统化的资源组织策略,涉及操作系统规范遵循、权限模型适配、多用户环境支持以及未来扩展性等多个维度。WISE902 允许开发者通过可视化编辑器和底层属性配置相结合的方式,精细规划目标机器上的目录树结构,确保最终部署结果既符合行业惯例,又能满足特定业务需求。
4.1.1 典型目录结构模型(Program Files、AppData等)
Windows 操作系统定义了一套标准化的目录结构模型,旨在区分不同类型的应用数据存放位置,保障系统稳定性与用户数据隔离。WISE902 内置了对这些标准路径的支持,开发者可通过预定义常量快速引用:
| 路径常量 | 对应物理路径(64位系统示例) | 用途说明 |
|---|---|---|
[ProgramFilesFolder] | C:\Program Files\ | 存放主程序二进制文件,受UAC保护 |
[ProgramFiles64Folder] | C:\Program Files\ | 显式指向64位程序目录 |
[ProgramFiles32Folder] | C:\Program Files (x86)\ | 32位程序专用目录 |
[CommonAppDataFolder] | C:\ProgramData\ | 所有用户共享的配置与缓存 |
[AppDataFolder] | C:\Users\<User>\AppData\Roaming\ | 当前用户专属配置 |
[LocalAppDataFolder] | C:\Users\<User>\AppData\Local\ | 本地缓存,不随域漫游 |
[StartMenuFolder] | C:\ProgramData\Microsoft\Windows\Start Menu\ | 开始菜单快捷方式 |
[DesktopFolder] | C:\Users\<User>\Desktop\ | 用户桌面 |
注 :上述路径在非英文系统或自定义分区环境下可能变化,应始终使用 WISE902 内建变量而非硬编码字符串。
典型的三层目录结构模型如下所示:
graph TD
A[安装根目录] --> B[Bin]
A --> C[Config]
A --> D[Logs]
A --> E[Resources]
A --> F[Templates]
B --> B1[主程序.exe]
B --> B2[插件.dll]
C --> C1[appsettings.json]
D --> D1[error.log]
E --> E1[icons/]
E --> E2[themes/]
F --> F1[default_template.docx]
该结构体现了职责分离原则:
- Bin/ :存放所有可执行文件和依赖库,便于 PATH 注册;
- Config/ :集中管理配置文件,便于备份与迁移;
- Logs/ :写入运行日志,建议设置定期清理策略;
- Resources/ :包含图像、语言包、样式表等静态资源;
- Templates/ :提供默认模板文件,首次运行时复制到用户目录。
在 WISE902 中配置此结构的方法如下:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLDIR" Name="MyApp">
<Directory Id="BinFolder" Name="bin"/>
<Directory Id="ConfigFolder" Name="config"/>
<Directory Id="LogFolder" Name="logs"/>
<Directory Id="ResourceFolder" Name="resources"/>
<Directory Id="TemplateFolder" Name="templates"/>
</Directory>
</Directory>
</Directory>
代码逻辑逐行解读 :
1. <Directory Id="TARGETDIR" :根节点,代表目标系统的驱动器根目录。
2. 嵌套 <Directory Id="ProgramFilesFolder"> :引用系统预定义的 Program Files 目录。
3. Id="INSTALLDIR" 并命名为 MyApp :这是主安装目录,其完整路径将在安装时由用户指定或默认填充。
4. 各子目录分别对应功能模块,后续文件可按 Component 分组挂载至对应节点。
参数说明:
- Id :唯一标识符,用于在其他地方(如组件、快捷方式)引用该目录;
- Name :显示名称,支持中文;
- 层级嵌套反映物理路径关系,编译后自动生成相应文件夹。
通过这种方式,开发者可以在不编写任何脚本的情况下,声明完整的虚拟文件系统结构。更重要的是,这种基于 XML 的声明式设计使得结构变更易于版本控制和团队协作。
4.1.2 用户权限对安装路径的影响分析
Windows 的用户账户控制(UAC)机制对不同路径施加了严格的写入权限限制。以 C:\Program Files\ 为例,普通用户无法直接在此目录下创建或修改文件,必须通过管理员提权才能完成操作。这意味着安装程序在设计目录结构时,必须预先判断目标路径的访问权限,并据此调整行为策略。
WISE902 在编译阶段即可标记安装包是否需要管理员权限:
<Property Id="MSIUSEREALADMINDETECTION" Value="1"/>
<Condition Message="必须以管理员身份运行安装程序">
Privileged
</Condition>
逻辑分析 :
- Privileged 是 MSI 内建属性,表示当前安装会话具有提升权限;
- 若条件不满足(即非管理员运行),则弹出提示并终止安装;
- 此机制防止因权限不足导致部分文件写入失败,造成半安装状态。
对于不需要全局安装的轻量级工具,推荐使用 %AppData% 或 %LocalAppData% 路径,这类目录对当前用户完全可写,无需提权:
<Directory Id="AppDataFolder">
<Directory Id="INSTALLDIR" Name="MyLightApp"/>
</Directory>
此类设计适用于浏览器扩展、桌面小工具、个人笔记类软件等场景,具有“免安装”特性,适合非技术人员使用。
此外,还需注意多用户环境下的数据共享问题。若应用需在多个用户间共享配置或数据库,应优先选择 [CommonAppDataFolder] (即 C:\ProgramData\ ),并确保该目录下的文件权限设置正确:
// 示例:在安装后脚本中设置 ACL
System.Security.AccessControl.DirectorySecurity ds =
Directory.GetAccessControl(commonDataPath);
ds.AddAccessRule(new FileSystemAccessRule(
new SecurityIdentifier(WellKnownSidType.WorldSid, null),
FileSystemRights.Read,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None,
AccessControlType.Allow));
Directory.SetAccessControl(commonDataPath, ds);
参数说明 :
- WorldSid 表示所有用户;
- Read 权限允许读取但禁止修改;
- 继承标志确保子目录自动获得相同权限。
综上所述,目录结构设计不能脱离权限上下文。开发者应在项目初期明确应用的部署模式(单用户 vs 多用户)、安全等级(是否需加密存储)和维护方式(集中管理 or 分散部署),再据此选择合适的路径模型。WISE902 提供的丰富路径变量和条件判断机制,使这一过程更加可控和可预测。
4.2 自定义安装路径功能实现
允许用户自定义安装路径是提升用户体验的重要手段,尤其对于高级用户或IT管理员而言,能够精确控制软件部署位置有助于资源优化和统一管理。然而,这一功能的背后隐藏着诸多技术挑战:路径格式合法性、磁盘空间检查、权限验证、路径冲突处理等。WISE902 提供了完整的 UI 控件与事件钩子,支持开发者构建健壮的路径选择机制。
4.2.1 默认路径预设与用户可修改性配置
在 WISE902 的安装向导中,默认安装路径通常出现在“选择安装位置”页面。该路径可通过属性预先设定:
<Property Id="INSTALLDIR"
Value="[ProgramFilesFolder]MyCompany\MyApplication\"/>
此设置将在安装开始时初始化 INSTALLDIR 变量,用户可在界面上修改。若希望禁用编辑功能(仅用于查看),可通过 UI 控件属性锁定:
<Control Type="PathEdit" Property="INSTALLDIR" X="25" Y="120" Width="300" Height="18">
<Condition Action="disable">Installed</Condition>
</Control>
逻辑分析 :
- PathEdit 是专门用于路径输入的控件类型;
- Property="INSTALLDIR" 绑定到前述属性;
- <Condition Action="disable">Installed</Condition> 表示如果软件已安装,则禁用编辑(适用于升级场景);
此外,还可通过条件表达式动态设置默认路径:
<SetProperty Id="INSTALLDIR" Value="[CommonAppDataFolder]MyAppPortable\" Before="LaunchConditions">
<![CDATA[PORTABLEMODE=1]]>
</SetProperty>
参数说明 :
- Before="LaunchConditions" 确保在安装校验前设置;
- PORTABLEMODE=1 为自定义属性,可通过命令行传入 /q PORTABLEMODE=1 启动便携模式;
- 此机制可用于同一安装包支持多种部署形态。
4.2.2 路径合法性检测与空间容量判断
为防止无效路径导致安装失败,需在用户确认前执行校验。WISE902 支持通过自定义动作(CustomAction)实现:
[CustomAction]
public static ActionResult ValidateInstallPath(Session session)
{
string path = session["INSTALLDIR"];
if (string.IsNullOrWhiteSpace(path))
return ActionResult.Failure;
if (path.IndexOfAny(Path.GetInvalidPathChars()) >= 0)
{
session.Log("Invalid characters in path.");
return ActionResult.Failure;
}
try
{
DriveInfo drive = new DriveInfo(Path.GetPathRoot(path));
long requiredSpace = 500 * 1024 * 1024; // 500MB
if (drive.AvailableFreeSpace < requiredSpace)
{
session.Log($"Insufficient disk space: {drive.AvailableFreeSpace / 1024 / 1024} MB available");
return ActionResult.Failure;
}
}
catch (Exception ex)
{
session.Log("Error checking disk space: " + ex.Message);
return ActionResult.Failure;
}
return ActionResult.Success;
}
调用方式 (在 .wxs 文件中):
<InstallExecuteSequence>
<Custom Action="ValidateInstallPath" Before="CostInitialize">NOT Installed</Custom>
</InstallExecuteSequence>
逻辑分析 :
- CostInitialize 是 MSI 计算文件成本的阶段,此前必须确定路径;
- NOT Installed 防止在升级时重复执行;
- 若返回 Failure ,安装流程将中断并提示错误。
该机制显著提升了安装包的鲁棒性,避免因路径问题导致静默失败。结合 WISE902 的日志输出功能,还可进一步定位具体错误原因,便于技术支持排查。
4.3 快捷方式与启动项生成规则
安装完成后,用户期望能通过桌面、开始菜单或开机自启等方式便捷访问应用。WISE902 提供了对快捷方式和启动项的全面支持,可通过声明式语法或脚本方式生成。
4.3.1 桌面与开始菜单快捷方式创建
<Shortcut Id="DesktopShortcut"
Name="My Application"
Target="[INSTALLDIR]bin\MyApp.exe"
WorkingDirectory="INSTALLDIR"
Icon="AppIcon.ico"/>
<DirectoryRef Id="DesktopFolder">
<Component Id="DesktopShortcutComponent" Guid="*">
<CreateFolder/>
<ShortcutRef Id="DesktopShortcut"/>
<RemoveFolder Id="DesktopFolder" On="uninstall"/>
<RegistryValue Key="Software\MyCompany\MyApp" Root="HKCU" Type="string" Value="" />
</Component>
</DirectoryRef>
逻辑分析 :
- Target 指向主程序,使用 [INSTALLDIR] 动态解析;
- WorkingDirectory 设置工作目录,避免相对路径错误;
- ShortcutRef 引用已定义的快捷方式模板;
- 卸载时自动删除并清理注册表。
4.3.2 启动组注册与服务项关联设置
对于需要开机启动的应用:
<DirectoryRef Id="StartupFolder">
<Component Id="StartupComponent" Guid="*">
<Shortcut Id="StartupShortcut"
Name="MyApp AutoStart"
Target="[INSTALLDIR]bin\MyApp.exe"
Arguments="/minimized"
WorkingDirectory="INSTALLDIR"/>
<RemoveFolder Id="StartupFolder" On="uninstall"/>
<RegistryValue Key="Software\MyCompany\MyApp" Root="HKCU" Type="string" Value="" />
</Component>
</DirectoryRef>
参数说明 :
- Arguments="/minimized" 控制启动参数;
- 注册表条目用于记录组件状态,便于修复与查询。
综上,通过合理设计目录结构、实现路径校验与快捷方式生成,可大幅提升安装包的专业度与可靠性。WISE902 的强大功能使其成为构建高质量 Windows 安装包的理想选择。
5. 安装序列定义与组件选择逻辑
在现代软件分发体系中,安装包已不再是简单的文件复制行为,而是演变为一个具备高度可配置性、流程控制能力与用户交互智能性的部署系统。WISE902作为一款专业级安装包构建工具,提供了强大的安装序列管理机制和组件化选择模型,使得开发者能够精确掌控从用户点击“安装”按钮开始,到最终服务成功运行的每一个环节。本章节深入剖析 WISE902 中安装序列的阶段划分、执行顺序控制机制,并探讨如何通过组件化设计实现灵活的功能模块管理,以及基于条件表达式的动态安装逻辑控制。这些功能不仅提升了用户体验,也为大型复杂应用的部署提供了坚实的技术支撑。
5.1 安装流程的阶段划分与执行顺序
安装过程本质上是一个状态机驱动的多阶段任务流,每个阶段承担特定职责并依赖前一阶段的结果。WISE902 将整个安装生命周期划分为多个逻辑清晰、职责分明的执行阶段,开发者可以通过图形化编辑器或脚本方式对各阶段的行为进行定制,从而实现精细化的流程控制。
5.1.1 初始化、文件复制、注册表写入、服务启动等环节编排
安装流程的核心在于 阶段化任务调度 。WISE902 提供了标准的安装阶段模板,包括但不限于以下关键节点:
| 阶段名称 | 执行时机 | 主要职责 |
|---|---|---|
OnInitialize | 安装程序启动时 | 环境检测、变量初始化、权限请求 |
BeforeInstall | 用户确认安装后,文件操作前 | 条件判断、备份旧版本数据 |
FileCopy | 正式文件部署阶段 | 复制主程序、库文件、资源目录 |
RegistryWrite | 文件写入完成后 | 写入COM组件信息、文件关联、启动项 |
ServiceInstall | 注册表更新后 | 安装Windows服务并设置启动类型 |
AfterInstall | 所有安装动作完成 | 启动主程序、创建快捷方式、清理临时文件 |
该流程并非固定不变,开发者可在 WISE902 的“安装序列编辑器”中拖拽调整各动作的执行顺序,甚至插入自定义脚本动作。例如,在某些场景下需要先停止正在运行的服务再覆盖文件,则应将“停止服务”脚本置于 FileCopy 前。
为了说明这一机制的实际应用,考虑如下典型需求:
在安装前检查是否存在旧版本服务,若存在则自动卸载后再继续安装。
可通过添加 VBScript 脚本来实现此逻辑:
' StopOldService.vbs
Dim serviceManager, serviceName, service
serviceName = "MyAppService"
Set serviceManager = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set services = serviceManager.ExecQuery("SELECT * FROM Win32_Service WHERE Name='" & serviceName & "'")
If services.Count > 0 Then
For Each service In services
If service.State = "Running" Then
service.StopService()
Do While service.State <> "Stopped"
WScript.Sleep 500
Set tempSvc = GetObject("winmgmts:Win32_Service.Name='" & serviceName & "'")
If Not IsNull(tempSvc) Then Set service = tempSvc
Loop
End If
service.Delete_() ' 卸载服务
Next
LogMessage("旧版服务已卸载。")
Else
LogMessage("未检测到旧版服务。")
End If
Sub LogMessage(msg)
Call Session.Property("CustomActionData"), msg
End Sub
代码逻辑逐行解析:
- 第2行 :声明变量用于访问 WMI(Windows Management Instrumentation)接口。
- 第4–6行 :连接本地计算机的 WMI 命名空间,并查询指定名称的服务是否存在。
- 第7–18行 :遍历结果集,若服务处于运行状态则调用
StopService()方法终止。 - 第10–14行 :使用轮询机制等待服务真正停止,避免后续操作失败。
- 第15行 :调用
Delete_()方法彻底移除服务注册信息。 - 第20–24行 :定义日志输出函数,便于调试和记录行为。
该脚本可作为“自定义动作”嵌入至 BeforeInstall 阶段,确保新版本安装环境干净无冲突。
此外,WISE902 支持 事务型安装序列 ,即一旦某个阶段失败,可自动回滚之前已完成的操作(如删除已复制的文件、撤销注册表修改),极大增强了部署可靠性。
下面用 Mermaid 流程图展示上述安装序列的整体执行流程:
graph TD
A[启动安装程序] --> B{管理员权限?}
B -- 是 --> C[OnInitialize: 初始化变量]
B -- 否 --> Z[请求UAC提升]
C --> D[BeforeInstall: 检查旧服务]
D --> E[执行StopOldService.vbs]
E --> F[FileCopy: 部署程序文件]
F --> G[RegistryWrite: 写入注册表项]
G --> H[ServiceInstall: 安装并启动服务]
H --> I[AfterInstall: 创建桌面快捷方式]
I --> J[完成安装]
style A fill:#f9f,stroke:#333
style J fill:#cfc,stroke:#333
此图清晰地展示了各阶段之间的依赖关系与控制流走向,有助于团队协作时统一理解安装逻辑。
5.1.2 安装前后脚本触发时机设定
除了内置阶段外,WISE902 允许开发者在关键时间节点注入自定义脚本(支持 VBScript、JScript 和外部 EXE),以扩展安装行为。这些脚本被称为“自定义动作”(Custom Actions),其执行时机决定了其用途和安全性。
自定义动作类型与触发点对比表:
| 动作类型 | 运行上下文 | 适用场景 | 注意事项 |
|---|---|---|---|
| Immediate Custom Action | 安装UI线程 | 变量赋值、路径计算 | 不可长时间阻塞 |
| Deferred Custom Action | 系统账户权限 | 文件操作、服务安装 | 必须幂等且支持回滚 |
| Rollback Custom Action | 回滚期间执行 | 清理部分写入的数据 | 不能失败 |
| Commit Custom Action | 提交阶段执行 | 激活许可证、发送安装通知 | 已无法回滚 |
以“设置安装路径为用户指定目录”为例,演示 Immediate 类型脚本的使用:
' SetInstallDir.vbs
Dim userChoice, targetDir
userChoice = Session.Property("INSTALLDIR_CHOICE") ' 用户在UI中选择的根目录
Select Case UCase(userChoice)
Case "PROGRAMFILES"
targetDir = Session.Property("ProgramFilesFolder")
Case "APPDATA"
targetDir = Session.Property("AppDataFolder")
Case Else
targetDir = Session.Property("DEFAULT_CUSTOM_PATH")
End Select
Session.Property("INSTALLDIR") = targetDir & "\MyCompany\MyApp\"
LogInfo("安装目录设置为: " & Session.Property("INSTALLDIR"))
参数说明与逻辑分析:
-
Session.Property()是 WISE902 提供的对象接口,用于读取/写入安装会话中的公共变量。 -
INSTALLDIR_CHOICE是由前一步 UI 页面收集的用户输入值。 - 根据不同选项拼接最终路径,并更新全局
INSTALLDIR属性,供后续阶段使用。 - 该脚本应在
OnInitialize后立即执行,属于 Immediate 类型,不涉及敏感操作。
而对于需要高权限的操作(如注册服务),必须使用 Deferred 模式并在单独进程中运行。WISE902 编译时会自动将其封装为二进制嵌入资源,并在适当时候释放执行。
示例:注册 Windows 服务的批处理脚本(RegisterService.bat)
@echo off
set SVC_NAME=MyAppBackend
set SVC_DISPLAY=My Application Background Service
set SVC_PATH=%~dp0bin\myapp_service.exe
if exist "%SVC_PATH%" (
sc create "%SVC_NAME%" binPath= "%SVC_PATH%" DisplayName= "%SVC_DISPLAY%" start= auto
sc description "%SVC_NAME%" "Provides background processing for MyApp."
sc start "%SVC_NAME%"
echo 服务注册成功。
exit /b 0
) else (
echo 错误:服务可执行文件不存在!
exit /b 1
)
执行逻辑说明:
-
%~dp0表示当前脚本所在目录,确保路径正确。 - 使用
sc create命令注册服务,设置为自动启动。 - 添加描述信息增强可维护性。
- 成功后立即启动服务,提升用户体验。
此 .bat 文件需配置为 Deferred Custom Action,并勾选“以系统权限运行”。
通过合理规划脚本的触发时机与运行模式,可以构建出既安全又高效的安装流程,满足企业级部署的严苛要求。
5.2 组件化安装设计模式
随着软件功能日益庞大,单一整体式安装已难以满足多样化部署需求。组件化安装成为主流方案,允许用户按需选择安装模块,减少冗余占用,提高部署灵活性。
5.2.1 主程序、插件模块与辅助工具的分组管理
在 WISE902 中,“组件”(Component)是最小的可选安装单元,通常对应一组相关联的文件、注册表项和服务。通过将软件拆分为多个组件,可实现细粒度控制。
典型的组件划分策略如下:
| 组件名称 | 包含内容 | 默认状态 | 适用场景 |
|---|---|---|---|
| MainApplication | 主EXE、核心DLL、配置文件 | 必选 | 所有用户都需要 |
| DatabaseEngine | SQLite引擎、初始化脚本 | 可选 | 仅本地部署需要 |
| Plugin_PDFExport | PDF导出插件及相关资源 | 可选 | 需要打印功能的用户 |
| Tool_ConfigEditor | 独立配置编辑器 | 可选 | 管理员专用 |
| Documentation | 帮助文档CHM文件 | 可选 | 开发者参考 |
在 WISE902 的“组件视图”中,可通过树形结构组织这些模块,并设置父子关系。例如,“高级功能包”可作为父组件,包含若干子插件。
组件还支持 特征(Feature)映射 ,即将组件绑定到安装向导中的复选框控件上,使用户可在界面上直观选择。
示例:组件定义 XML 片段(简化表示)
<Feature Id="MainApp" Title="主程序" Description="核心应用程序" Level="1">
<ComponentRef Id="cmp_MainExecutable"/>
<ComponentRef Id="cmp_CoreLibraries"/>
</Feature>
<Feature Id="PDFPlugin" Title="PDF导出插件" Description="支持导出为PDF格式" Level="2">
<ComponentRef Id="cmp_PdfExporter"/>
<Condition Level="1"><![CDATA[INSTALL_PDF = 1]]></Condition>
</Feature>
参数解释:
-
Level表示组件层级,数值越低优先级越高(1为必装)。 -
<Condition>元素定义了该组件的安装条件,只有当会话变量INSTALL_PDF为1时才激活。 - 可结合 UI 页面上的复选框联动,实现动态加载。
此外,组件还可设置 安装位置属性 ,例如某些工具可能希望安装到 SystemTools 目录而非主程序目录,可通过 Directory 引用来实现路径分离。
5.2.2 组件依赖关系定义与冲突检测
复杂的软件系统常存在组件间的依赖关系,如插件依赖主程序框架、数据库模块依赖特定运行时库。WISE902 提供依赖管理系统,防止因缺失依赖导致运行时错误。
依赖关系建模方式:
- 显式引用 :在组件属性中手动指定其所依赖的其他组件ID。
- 自动扫描 :启用“依赖分析器”,扫描DLL导入表,自动识别所需运行库(如VC++ Redist、.NET Framework)。
- 条件约束 :通过条件表达式强制依赖成立。
例如,定义“PDF插件”依赖于“主程序”和“Ghostscript渲染引擎”:
<Component Id="cmp_PdfExporter" Guid="{...}">
<CreateFolder/>
<File Source="pdf_export.dll"/>
<Dependency Component="cmp_MainExecutable"/>
<Dependency Component="cmp_GhostscriptRuntime" MinVersion="9.50"/>
</Component>
当用户尝试仅安装 PDF 插件时,WISE902 会在预检阶段提示:“缺少依赖组件 Ghostscript Runtime (v9.50+)”,并建议自动勾选。
同时,WISE902 支持 冲突检测机制 ,用于识别互斥组件。例如:
- “轻量版”与“完整版”不可共存;
- “开发版驱动”与“生产版驱动”存在文件路径冲突。
可在项目设置中添加冲突规则:
<ConflictRule>
<Component Id="LightEdition"/>
<Component Id="FullEdition"/>
<Message>轻量版与完整版不能同时安装,请选择其一。</Message>
</ConflictRule>
安装向导在加载时会实时校验此类规则,并禁用非法组合选项。
以下 Mermaid 图展示组件依赖与冲突关系:
graph LR
A[主程序] --> B[PDF插件]
A --> C[数据库模块]
B --> D[Ghostscript引擎]
C --> E[SQLite运行时]
F[完整版] -.->|冲突| G[轻量版]
H[调试工具] --> A
classDef critical fill:#ffebee,stroke:#c62828;
classDef optional fill:#e8f5e8,stroke:#2e7d32;
class A,F,G,H critical;
class B,C,D,E optional;
通过可视化手段,团队成员可快速掌握模块间耦合情况,优化架构设计。
5.3 条件安装与功能开关控制
真正的智能化安装不仅体现在流程控制上,更体现在根据运行环境动态决策的能力。WISE902 提供丰富的条件表达式语言,支持基于系统状态、用户输入和外部因素的条件分支。
5.3.1 基于用户选择的条件表达式编写
条件表达式广泛应用于控制组件是否安装、页面是否显示、按钮是否可用等场景。其语法类似于 Windows Installer 的条件语言,但经过 WISE902 扩展后更加易用。
常见条件表达式示例:
| 场景 | 条件表达式 | 说明 |
|---|---|---|
| 用户选择了“高级安装” | INSTALL_LEVEL = "Advanced" | 控制显示更多配置页 |
| 安装路径为空 | NOT INSTALLDIR | 提示用户选择有效路径 |
| 安装PDF插件 | FEATURE_PDFPLUGIN = 3 | 3表示“已选中” |
| 不安装帮助文档 | FEATURE_DOC <> 1 | 排除该组件 |
在实际项目中,常结合变量传递机制实现跨阶段通信。例如:
' 用户在UI中选择安装类型
Session.Property("INSTALL_PROFILE") = "ServerMode"
随后在组件条件中引用:
<Condition Level="1">INSTALL_PROFILE = "ServerMode"</Condition>
即可实现“服务器模式”专属组件的自动激活。
此外,WISE902 支持 条件宏(Conditional Macro) ,可简化重复判断:
<Macro Name="Is64BitOS">
VersionNT64
</Macro>
<!-- 在64位系统上才安装x64驱动 -->
<Condition Level="1">$(var.Is64BitOS)</Condition>
这使得条件逻辑更具可读性和可维护性。
5.3.2 系统位数、已安装软件状态的判断逻辑嵌入
除了用户输入外,安装程序还需感知运行环境。WISE902 内置大量预定义属性,可用于判断操作系统版本、架构、已安装软件等。
常用系统属性列表:
| 属性名 | 含义 | 示例值 |
|---|---|---|
VersionNT | NT内核版本 | 603 (Win8.1), 1000 (Win10) |
VersionNT64 | 是否64位系统 | TRUE/FALSE |
ProcessorArchitecture | CPU架构 | x86, amd64, arm64 |
NetFx4FullInstalled | .NET Framework 4.8是否安装 | 1表示已安装 |
SQLSERVER_INSTALLED | SQL Server实例是否存在 | 由自定义脚本设置 |
以检测 .NET Framework 4.8 为例,编写前置检查脚本:
' CheckDotNet.vbs
Dim netRegKey, installedVersion
netRegKey = "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"
Set wshShell = CreateObject("WScript.Shell")
On Error Resume Next
installedVersion = wshShell.RegRead("HKEY_LOCAL_MACHINE\" & netRegKey & "Release")
If Err.Number <> 0 Or installedVersion < 528040 Then
Session.Property("NETFX_REQUIRED") = "1"
MsgBox "需要安装 .NET Framework 4.8 才能继续。", vbExclamation, "依赖缺失"
Else
Session.Property("NETFX_REQUIRED") = "0"
End If
该脚本在 OnInitialize 阶段执行,将结果存入 NETFX_REQUIRED 变量,后续可用作条件判断依据:
<Feature Id="MainApp" Level="1">
<Condition Level="0">NETFX_REQUIRED = "1"</Condition>
</Feature>
当条件不满足时,降低组件等级至0(不安装),并引导用户先安装依赖。
综上所述,通过深度整合用户选择与系统环境判断,WISE902 实现了高度自适应的安装逻辑,显著提升了部署成功率与兼容性。
6. 用户界面(UI)定制与图形化设计
6.1 内置安装向导界面布局解析
WISE902 提供了一套高度可配置的内置安装向导框架,支持开发者在不编写额外图形代码的前提下,构建专业级的安装流程。该向导基于分页式结构,每一页对应一个安装阶段,具备明确的功能定位和交互逻辑。
标准页面通常包括以下四类核心界面:
| 页面类型 | 功能描述 | 可定制项 |
|---|---|---|
| 欢迎页 | 展示产品名称、版本信息及厂商Logo,引导用户进入安装流程 | 标题、副标题、图片资源、按钮文本 |
| 许可协议页 | 显示最终用户许可协议(EULA),要求用户接受后方可继续 | 协议内容来源(RTF/HTML)、是否强制接受 |
| 安装路径页 | 允许用户选择或修改目标安装目录 | 默认路径、路径输入框可见性、检测逻辑 |
| 安装进度页 | 实时显示文件复制、注册表写入等操作进度,并提供取消安装功能 | 进度条样式、后台线程控制、预计剩余时间 |
| 完成页 | 安装成功提示,可配置是否启动程序、打开帮助文档或创建桌面快捷方式 | 复选框选项、按钮行为绑定 |
页面跳转由内部状态机驱动,其执行顺序可通过 InstallSequence.xml 配置文件进行调整。例如,若需在“选择组件”前插入系统兼容性检查页,可在序列中插入自定义步骤:
<PageSequence>
<Page id="Welcome" next="LicenseAgreement" />
<Page id="LicenseAgreement" next="SystemCheck" condition="UserAcceptedEULA"/>
<Page id="SystemCheck" next="InstallationPath" action="RunScript(SystemRequirementsCheck)" />
<Page id="InstallationPath" next="ComponentSelection" />
<Page id="ComponentSelection" next="Progress" />
<Page id="Progress" next="Finish" />
</PageSequence>
每个页面均支持事件回调机制,可用于动态更新UI元素。例如,在“安装进度页”中通过脚本实时刷新状态标签:
procedure OnProgressUpdated(Sender: TObject);
begin
SetLabelText('StatusLabel', Format('正在安装模块 %s...', [GetCurrentModuleName]));
UpdateProgressBar(GetCurrentProgressPercent);
end;
此外,WISE902 支持非线性导航逻辑,如根据用户权限隐藏高级设置页,实现方式如下:
function ShouldShowAdvancedPage: Boolean;
begin
Result := IsUserAdministrator() and (GetSystemArchitecture() = 'x64');
end;
此逻辑可在页面加载时调用,决定是否将“高级配置页”加入导航栈。
mermaid格式流程图展示页面跳转逻辑:
graph TD
A[欢迎页] --> B{用户点击下一步}
B --> C[许可协议页]
C --> D{接受协议?}
D -- 是 --> E[系统检查页]
D -- 否 --> C
E --> F[安装路径设置]
F --> G[组件选择]
G --> H[安装进度]
H --> I[完成页]
I --> J[安装结束]
所有页面共享统一的UI容器模型,包含头部区域(Header)、内容区(Content)和底部操作栏(Footer)。开发者可通过CSS-like样式表控制字体、颜色和间距:
Page.Welcome {
background-image: url("welcome_bg.png");
font-family: "Microsoft YaHei";
title-color: #2c3e50;
}
Button.Next {
border-radius: 8px;
background-color: #3498db;
color: white;
}
这种结构化的布局设计确保了跨平台一致性,同时为深度定制提供了扩展接口。
6.2 UI主题与品牌元素集成
为了强化品牌形象,WISE902 允许将企业VI元素无缝集成到安装包界面中。这一过程不仅涉及静态资源替换,还包括响应式渲染策略的设计。
自定义Logo和背景图可通过项目属性面板直接导入,支持PNG、JPG、BMP等多种格式。推荐使用透明通道的PNG图像以获得更自然的融合效果。关键参数如下表所示:
| 资源类型 | 推荐尺寸 | 分辨率要求 | 文件大小限制 | 使用位置 |
|---|---|---|---|---|
| 主Logo | 256×256 px | 96 DPI | ≤500 KB | 欢迎页左上角 |
| 背景图 | 1024×768 px | 96 DPI | ≤2 MB | 所有页面背景 |
| 图标(ICO) | 64×64 px | 多尺寸嵌入 | ≤100 KB | 安装程序图标 |
| 加载动画帧序列 | 128×128 px ×8 | 逐帧PNG | 总≤1 MB | 进度页动画 |
字体样式的应用需考虑操作系统默认字体差异。建议通过 FontConfig.xml 显式声明备选字体链:
<FontFamily name="BrandSans">
<Fallback>Microsoft YaHei</Fallback>
<Fallback>SimHei</Fallback>
<Fallback>Arial</Fallback>
</FontFamily>
高DPI适配是现代UI设计的关键挑战。WISE902采用双模式渲染引擎:对于DPI > 120的显示器,自动启用矢量缩放算法,并对位图资源进行插值补偿。开发者应提供@2x资源用于Retina级屏幕:
procedure LoadBackgroundImage;
var
scale: Integer;
begin
scale := GetDPIScale(); // 返回100, 125, 150, 200
case scale of
100: SetBackground('bg_1x.jpg');
150: SetBackground('bg_1.5x.jpg');
200: SetBackground('bg_2x.jpg');
end;
end;
此外,主题色可通过全局变量注入,便于统一风格:
[Theme]
PrimaryColor=#2980b9
SecondaryColor=#ecf0f1
TextColor=#34495e
AccentColor=#e74c3c
这些变量可在所有页面中引用,实现按钮、边框、高亮等元素的一致性渲染。
值得注意的是,所有资源变更后必须重新编译安装包以生成新的资源索引表,否则可能出现加载失败或回退至默认主题的情况。
简介:WISE902是一款专业的Windows安装包制作工具,支持创建用户友好、功能完整的安装程序,广泛用于软件部署与分发。通过该工具,开发者可将应用程序及其依赖文件打包为自解压安装程序,实现自动化安装、多语言支持、条件安装和卸载功能。本文详细介绍了WISE902的项目创建流程、目录结构定义、用户界面定制、脚本添加及安装序列设置,并强调了readme.txt在提供版本信息、系统需求和技术支持中的重要作用。使用WISE902不仅能提升部署效率,还可增强软件的专业性和兼容性。
更多推荐


所有评论(0)