8.4 部署与发布
概述
WPF应用程序的部署与发布是开发流程的最后关键步骤。本节将详细介绍从生成可执行文件到最终分发的完整流程,包括多种部署方式的比较与选择、依赖项管理以及安装程序的制作。
部署方式对比
1. ClickOnce部署
- 特点:
- 支持自动更新和版本控制
- 无需管理员权限
- 通过网页或网络共享分发
- 适用场景:
- 企业内部应用
- 需要频繁更新的工具类软件
<!-- ClickOnce发布示例配置 -->
<PropertyGroup>
<PublishUrl>http://server/app/</PublishUrl>
<InstallUrl>http://server/app/</InstallUrl>
<ProductName>MyWPFApp</ProductName>
<PublishVersion>1.0.0</PublishVersion>
</PropertyGroup>
2. MSI安装包
- 优势:
- 支持自定义安装路径
- 可注册COM组件
- 支持系统级安装
- 工具推荐:
- WiX Toolset(开源)
- InstallShield(商业)
3. 独立部署(Self-contained)
- 特点:
- 包含.NET运行时
- 单文件发布选项
- 体积较大但兼容性好
# 发布命令示例
dotnet publish -c Release -r win-x64 --self-contained true
依赖项管理
关键检查项
- .NET Framework版本兼容性
- VC++运行时库(如使用C++组件)
- 第三方DLL的部署位置
- 配置文件(App.config)的包含
解决方案
<!-- 项目文件中的依赖项配置 -->
<ItemGroup>
<Content Include="libs\thirdparty.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
安装程序制作实战
使用WiX创建MSI
- 安装WiX Toolset扩展
- 创建.wxs项目文件
- 定义组件和文件结构
- 添加注册表项和快捷方式
<!-- WiX示例片段 -->
<Component Id="MainExecutable" Guid="*">
<File Source="$(var.MyApp.TargetPath)" KeyPath="yes"/>
<Shortcut Id="StartMenuShortcut" Directory="ProgramMenuFolder"
Name="My App" WorkingDirectory="INSTALLFOLDER"/>
</Component>
数字签名与安全
- 必要性:避免安全警告,建立用户信任
- 工具链:
- SignTool(Windows SDK)
- Let's Encrypt(免费证书)
- DigiCert(商业证书)
# 签名命令示例
signtool sign /fd SHA256 /a /tr http://timestamp.digicert.com /td SHA256 /f cert.pfx /p password app.exe
版本更新策略
| 更新方式 | 实现方法 | 适用场景 |
|---|---|---|
| 自动更新 | 使用AutoUpdater.NET等库 | 消费者应用 |
| 手动下载安装包 | 版本检测+下载链接 | 企业环境 |
| 应用内更新 | 通过Web API检查版本并下载补丁 | 专业软件 |
常见问题排查
缺失DLL错误
- 解决方案:使用Dependency Walker检查依赖链
权限不足
- 方案:在清单文件中请求管理员权限
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>启动崩溃(无错误提示)
- 调试方法:
- 查看Windows事件查看器
- 添加全局异常处理
AppDomain.CurrentDomain.UnhandledException += (s, e) => File.WriteAllText("crash.log", e.ExceptionObject.ToString());
- 调试方法:
最佳实践清单
- [ ] 测试在干净虚拟机上的安装
- [ ] 验证卸载流程是否完整
- [ ] 准备回滚方案
- [ ] 更新文档中的系统要求
- [ ] 检查多语言支持(如有)
专家提示:对于企业级应用,建议建立完整的部署流水线(CI/CD),将打包和签名过程自动化。
